来自Apache背景,过去我使用一对重写规则隐藏了.html文件扩展名:
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /.+\.html\ HTTP
RewriteRule ^(.+)\.html$ http://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^.+$ %{REQUEST_FILENAME}.html [L]
nginx的重写功能不同,可能的解决方案是here但是,nginx wiki建议如果可能的话,避免ifs是最佳解决方案,并讨论使用(try_files
)。我想知道是否有人有最好的方式来实现这样的事情,如同:
try_files $uri $uri.html =404;
在某些情况下有效,你会遇到大量的重定向问题等。在这种情况下有没有办法避免ifs?
答案 0 :(得分:1)
您可以像这样使用try_files指令:
location / {
try_files $uri $uri.html =404;
}
对于与位置块
匹配的每个uri执行以下操作根本没有重定向,只是nginx依次检查几个选项。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^.+$ %{REQUEST_FILENAME}.html [L]
前两行基本上是1.和2.除了nginx不需要重写url,因为try_files指令使得它足够聪明,只能在找到匹配时返回请求