如何在nginx中隐藏文件扩展名

时间:2011-07-24 18:48:56

标签: nginx rewrite clean-urls

来自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?

1 个答案:

答案 0 :(得分:1)

您可以像这样使用try_files指令:

location / {
  try_files $uri $uri.html =404;
}

对于与位置块

匹配的每个uri执行以下操作
  1. 检查是否有完全匹配的文件,如果是的话,请
  2. 如果未找到完全匹配,请尝试在请求中添加.html
  3. 如果没有找到,则返回404
  4. 根本没有重定向,只是nginx依次检查几个选项。

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME}.html -f
    RewriteRule ^.+$ %{REQUEST_FILENAME}.html [L]
    

    前两行基本上是1.和2.除了nginx不需要重写url,因为try_files指令使得它足够聪明,只能在找到匹配时返回请求