2015-05-04 26 views
16

Korzystanie .htaccess i ErrorDocument 404 /error.php, jeśli dostęp nieprawidłowy adres URL, np .: http://example/css/invalid-file.css:Odzyskaj REDIRECT_STATUS z error_page

<?php 
echo 'REDIRECT_STATUS: ', $_SERVER['REDIRECT_STATUS'], PHP_EOL, 
    'REDIRECT_URL: ', $_SERVER['REDIRECT_URL'], PHP_EOL, 
    'REDIRECT_REQUEST_METHOD: ', $_SERVER['REDIRECT_REQUEST_METHOD']; 

wyjściowy:

Ale w Nginx użyciu error_page 404 /error.php; ten nie działa, wynik w Nginx jest:

REDIRECT_STATUS: 200 
REDIRECT_URL: 
REDIRECT_REQUEST_METHOD: 

Uwaga: REDIRECT_URL i REDIRECT_REQUEST_METHOD są undefineds

Jak ustawić zmienne $_SERVER[REDIRECT_STATUS], $_SERVER[REDIRECT_REQUEST_METHOD] i $_SERVER[REDIRECT_URL] użyciu Ngnix? złożyć

fastcgi_params:

fastcgi_param QUERY_STRING   $query_string; 
fastcgi_param REQUEST_METHOD   $request_method; 
fastcgi_param CONTENT_TYPE   $content_type; 
fastcgi_param CONTENT_LENGTH   $content_length; 

fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name; 
fastcgi_param SCRIPT_NAME    $fastcgi_script_name; 
fastcgi_param PATH_INFO    $fastcgi_path_info; 
fastcgi_param PATH_TRANSLATED   $document_root$fastcgi_path_info; 
fastcgi_param REQUEST_URI    $request_uri; 
fastcgi_param DOCUMENT_URI   $document_uri; 
fastcgi_param DOCUMENT_ROOT   $document_root; 
fastcgi_param SERVER_PROTOCOL   $server_protocol; 

fastcgi_param GATEWAY_INTERFACE  CGI/1.1; 
fastcgi_param SERVER_SOFTWARE   nginx/$nginx_version; 

fastcgi_param REMOTE_ADDR    $remote_addr; 
fastcgi_param REMOTE_PORT    $remote_port; 
fastcgi_param SERVER_ADDR    $server_addr; 
fastcgi_param SERVER_PORT    $server_port; 
fastcgi_param SERVER_NAME    $server_name; 

fastcgi_param HTTPS     $https; 

# PHP only, required if PHP was built with --enable-force-cgi-redirect 
fastcgi_param REDIRECT_STATUS   200; 
+0

Co [http_response_code()] (https://php.net/manual/en/function.http-response-code.php) zwracają? – nasonfish

+0

Co mówi konfiguracja FastCGI dla 'REDIRECT_STATUS'? Założę się, że jest to zakodowane na "200". – Brad

Odpowiedz

14

Aby go naprawić w Nginx, trzeba stworzyć fałszywy location.

przykład:

# Set fake location for 404 
error_page 404 @fakeroute404; 

# Access fake location 
location @fakeroute404 { 
    ...# Others needed settings 

    include /etc/nginx/fastcgi_params; # Include fastcgi params 

    fastcgi_param REDIRECT_REQUEST_METHOD "GET"; # Set HTTP method 
    fastcgi_param REDIRECT_STATUS 404; # Set HTTP status 
    fastcgi_param REDIRECT_URL $uri; # Set REDIRECT_URL 
} 
Powiązane problemy