2015-05-04 65 views
16

使用.htaccessErrorDocument 404 /error.php,如果訪問的網址無效如:http://example/css/invalid-file.css檢索REDIRECT_STATUS與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']; 

輸出:

但在Nginx的使用error_page 404 /error.php;這是行不通的,結果在Nginx中是:

REDIRECT_STATUS: 200 
REDIRECT_URL: 
REDIRECT_REQUEST_METHOD: 

注:REDIRECT_URL和REDIRECT_REQUEST_METHOD是undefineds

如何使用Ngnix設置變量$_SERVER[REDIRECT_STATUS]$_SERVER[REDIRECT_REQUEST_METHOD]$_SERVER[REDIRECT_URL]

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

什麼[http_response_code()](https://php.net/manual/en/function.http-response-code.php)返回? – nasonfish

+0

你的FastCGI配置對'REDIRECT_STATUS'說什麼?我敢打賭,它被硬編碼爲'200'。 – Brad

回答

14

要解決它的Nginx,你需要創建一個假location

實施例:

# 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 
}