我有一个在 nginx + php-fpm 上运行的网站,我正在寻找一个可以实际显示 404 和其他一些错误页面的配置文件,因为我的配置文件的当前状态只会更改 URL,而不会显示 404 页面。例如。
我访问mywebsite.com/some-non-existent/url
时看到的是主页,而不是 404 页面。
此外,该try_files
语法是否“安全”使用或者我应该使用重写?
我已经广泛阅读了 nginx 文档以及 wordpress codex 配置。
下面我将粘贴我的配置文件,看看是否有人可以阐明这个问题。
server {
listen 127.0.0.1:80;
server_name my.website.com;
root home/my.website.com;
access_log logs/my.website.com-access.log;
error_log logs/my.website.com-error.log notice;
charset utf-8;
index index.php;
location / {
#try_files $uri $uri/ /index.php$is_args&$args;
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
#try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9054;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
location ~ /\. {
deny all;
}
error_page 404 /index.php?error=404;
}
并且上面还包括 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_NAME $fastcgi_script_name;
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;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
另外,nginx 是否从上到下读取位置?如果是这样,当它命中时,fastcgi_pass
它会读取/执行其下方的配置还是直接转到 php?
编辑:来自 WP StackExchange 的 X-posted
答案1
您应该总是喜欢try_files
重写。
我认为您的配置唯一真正的问题是:
try_files $uri $uri/ /index.php?$args;
对于 WordPress,无需传入$args
;而是从环境中获取它们。我的工作配置有:
try_files $uri $uri/ /index.php;
其次,这里有一个误区/
:
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
这也许不会这是一个问题,但是为了理智起见,我不会放弃它。
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;