| #!/usr/bin/perl | |
| # (C) Maxim Dounin | |
| # Tests for error_page directive. | |
| ############################################################################### | |
| use warnings; | |
| use strict; | |
| use Test::More; | |
| BEGIN { use FindBin; chdir($FindBin::Bin); } | |
| use lib 'lib'; | |
| use Test::Nginx; | |
| ############################################################################### | |
| select STDERR; $| = 1; | |
| select STDOUT; $| = 1; | |
| my $t = Test::Nginx->new()->has(qw/http proxy rewrite/)->plan(9) | |
| ->write_file_expand('nginx.conf', <<'EOF'); | |
| %%TEST_GLOBALS%% | |
| daemon off; | |
| events { | |
| } | |
| http { | |
| %%TEST_GLOBALS_HTTP%% | |
| server { | |
| listen 127.0.0.1:8080; | |
| server_name localhost; | |
| location /redirect200 { | |
| error_page 404 =200 http://example.com/; | |
| return 404; | |
| } | |
| location /redirect497 { | |
| # 497 implies implicit status code change | |
| error_page 497 https://example.com/; | |
| return 497; | |
| } | |
| location /error302redirect { | |
| error_page 302 http://example.com/; | |
| return 302 "first"; | |
| } | |
| location /error302return302text { | |
| error_page 302 /return302text; | |
| return 302 "first"; | |
| } | |
| location /return302text { | |
| return 302 "http://example.com/"; | |
| } | |
| location /error302return302args { | |
| error_page 302 /return302args?1; | |
| return 302 "first"; | |
| } | |
| location /error302return302varargs { | |
| error_page 302 /return302args?$arg_a; | |
| return 302 "first"; | |
| } | |
| location /return302args { | |
| return 302 "http://example.com/$args"; | |
| } | |
| location /error302rewrite { | |
| error_page 302 /rewrite; | |
| return 302 "first"; | |
| } | |
| location /rewrite { | |
| rewrite ^ http://example.com/; | |
| } | |
| location /error302directory { | |
| error_page 302 /directory; | |
| return 302 "first"; | |
| } | |
| location /directory { | |
| } | |
| location /error302auto { | |
| error_page 302 /auto; | |
| return 302 "first"; | |
| } | |
| location /auto/ { | |
| proxy_pass http://127.0.0.1:8081; | |
| } | |
| } | |
| } | |
| EOF | |
| mkdir($t->testdir() . '/directory'); | |
| $t->run(); | |
| ############################################################################### | |
| # tests for error_page status code change for redirects. problems | |
| # introduced in 0.8.53 and fixed in 0.9.5. | |
| like(http_get('/redirect200'), qr!HTTP!, 'redirect 200'); | |
| like(http_get('/redirect497'), qr!HTTP/1.1 302!, 'redirect 497'); | |
| # various tests to see if old location cleared if we happen to redirect | |
| # again in error_page 302 | |
| like(http_get('/error302redirect'), | |
| qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/}ms, | |
| 'error 302 redirect - old location cleared'); | |
| like(http_get('/error302return302text'), | |
| qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/}ms, | |
| 'error 302 return 302 text - old location cleared'); | |
| like(http_get('/error302return302args'), | |
| qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/1}ms, | |
| 'error 302 return 302 args - old location cleared'); | |
| like(http_get('/error302return302varargs?a=2'), | |
| qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/2}ms, | |
| 'error 302 return 302 var args - old location cleared'); | |
| like(http_get('/error302rewrite'), | |
| qr{HTTP/1.1 302(?!.*Location: first).*Location: http://example.com/}ms, | |
| 'error 302 rewrite - old location cleared'); | |
| like(http_get('/error302directory'), | |
| qr{HTTP/1.1 301(?!.*Location: first).*Location: http://}ms, | |
| 'error 302 directory redirect - old location cleared'); | |
| like(http_get('/error302auto'), | |
| qr{HTTP/1.1 301(?!.*Location: first).*Location: http://}ms, | |
| 'error 302 auto redirect - old location cleared'); | |
| ############################################################################### |