我有以下 nginx 服务器配置:
server {
listen 80;
server_name example.com
root /server/root;
index index.php;
error_page 404 = /index.php;
location ~ \.php$ {
try_files $uri =404;
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Request-URI $request_uri;
}
}
我想要的行为是,当 nginx 遇到对不存在的文件的请求时,它会通过 404 页面显示 index.php 页面。问题是,当 apache(被代理回的页面)收到请求时,它似乎仍在尝试解析原始请求。如果我转到http://example.com/blahblah,我收到错误:
The requested URL /blahblah was not found on this server.
这是 apache 错误。我怎样才能使 index.php 显示为 404 页面,就像它是静态文件一样?
答案1
您使用的是哪个版本的 nginx?此问题已在 1.1.12 中得到解决:http://nginx.org/en/CHANGES
编辑:如果您无法更新,您可以用以下代码替换当前的error_page和try_files:
location / {
try_files $uri $uri /index.php;
}
location ~ \.php$ {
# Leave the =404 at the end so we don't 500 when /index.php doesn't exist
try_files $uri /index.php =404;
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Request-URI $request_uri;
}
答案2
nginx 将不得不拦截 Apache 的响应并识别 404 版本,并返回其自己的版本。
如果 nginx 没有办法做到这一点,那么也许您可以将 Apache 配置为不返回任何内容 - 从而触发 nginx 自己的 404 状态?
答案3
如果您坚持使用 Apache,则必须设置 Apache 重写规则以将 404 错误发送到您的应用程序,而不是在 nginx 的配置中。