我试图让重写规则工作,我发现如果 URL 以问号开头,Nginx 无法按预期返回 404 错误。相反,根指令中定义的 index.html 会为所有以“?”开头的 url 提供服务。(例如example.com/?page-does-not-exist
适用于主页但不应该)
这使得无法从example.com/?format=feed&type=rss
->example.com/rss.xml
工作中获得重定向。这是一个从 Joomla 迁移到 Jekyll 的博客。
简而言之,访问example.com/123 会返回 404,而访问example.com/?123 不会。后者在 URL example.com?/123 处返回站点的主页。(没有文件或文件夹“123”,因此对它的请求应该总是失败。)
一切都与该站点完美配合,包括 HTTPS 重定向,但以问号开头的 URL 不会发生预期的 404 重定向。我该如何解决?
这是我的配置:
server {
server_name example.com;
root /var/www/example.com;
index index.html;
listen 443;
ssl on;
...
rewrite "/?format=feed&type=rss" https://example.com/rss.xml permanent;
location ~* \.(?:ico|css|js|gif|jpeg|jpg|png|txt|svg|eot|woff|ttf)$ {
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
add_header Access-Control-Allow-Origin *;
valid_referers none blocked example.com;
if ($invalid_referer) {
return 403;
}
}
}
# HTTP --> HTTPS
server {
listen 80;
server_name www.example.com example.com;
return 301 https://example.com$request_uri;
}
问号表示 uri 的路径部分的结尾和查询字符串的开头。因此,为什么 nginx 不会根据问号后面的部分返回 404;请求的资源确实存在,并且查询字符串参数只是传递给它。
关于问题的另一部分,我认为 nginx 的 rewrite 语句实际上与 uri 的查询字符串部分不匹配。
但是,您应该能够执行以下操作:
NGinx
将 a 后面的所有内容解释?
为查询字符串,而不是路径。它只会为不存在的路径返回 404,而不是查询字符串。
例如:
example.com/123
:如果路径/123
存在并且该路径有索引文件,则可以,否则将返回404example.com/?123
: 如果根目录下有索引文件example.com
就可以了。它不检查目录是否?123
存在,因为它不将其视为路径,而是将其视为查询字符串。