3

来自 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 的重写能力是不同的,一个可能的解决方案在这里,但是,nginx wiki 建议尽可能避免 ifs 是最好的解决方案,并讨论使用 ( try_files) 代替。我想知道是否有人有最好的方法来实现这样的东西,同时:

try_files $uri $uri.html =404;

在某些情况下有效,您会遇到大量重定向问题等。在这种情况下有什么方法可以避免 ifs 吗?

4

1 回答 1

1

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

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

这对与位置块匹配的每个 uri 执行以下操作

  1. 检查是否有完全匹配的文件,如果有,则提供
  2. 如果未找到完全匹配,则尝试将 .html 添加到请求中
  3. 如果没有找到,则返回 404

根本没有重定向,只是 nginx 依次检查了几个选项。

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

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

于 2012-08-16T20:41:30.213 回答