我试图得到一个重写规则工作,我发现,如果URL以问号开头,Nginx无法按预期返回404错误。 相反,根指令中定义的index.html适用于以“?”开头的所有URL。 (例如, example.com/?page-does-not-exist page-does-not- example.com/?page-does-not-exist适用于主页,但不应该)
这使得从example.com/?format=feed&type=rss – > example.com/rss.xml无法获得redirect。 这是从Joomla迁移到Jekyll的博客。
简而言之,访问example.com/123会返回404 ,而访问example.com/?123则不会 。 后者通过URL example.com?/ 123返回该网站的主页。 (没有文件或文件夹'123',所以它的请求应该总是失败。)
除了预期的404redirect不会出现在以问号开头的url之外,网站的所有function都能正常工作,包括HTTPSredirect。 我该如何解决?
这是我的configuration:
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的path部分的末端和查询string的开头。 因此,为什么nginx不会根据问号后面的部分返回404; 请求的资源确实存在,查询string参数只传递给它。
关于问题的其他部分,我相信nginx的rewrite语句实际上并不匹配uri的查询string部分。
但是,您应该能够按照以下方式进行操作:
if ($args ~ "format=feed&type=rss") { rewrite ^ https://example.com/rss.xml? permanent; }
NGinx解释所有的一切? 作为查询string,而不是path。
它只会返回404不存在的path,而不是查询string。
例如:
example.com/123 :如果path/123存在,如果有这个path的索引文件,那么它是好的,否则它会返回一个404
example.com/?123 :如果example.com/?123的根目录中有一个索引文件,那么就可以了。 它不检查目录?123存在,因为它不认为这是一个path,而是一个查询string。