【问题标题】:How to hide file extension in nginx如何在 nginx 中隐藏文件扩展名
【发布时间】:2011-07-24 18:48:56
【问题描述】:

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

【问题讨论】:

  • 为什么会遇到大量重定向问题?

标签: nginx rewrite clean-urls


【解决方案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 指令使它足够聪明,可以在找到匹配项时返回请求

【讨论】:

  • 您需要将$uri/ 添加到尝试列表中,否则您的索引文件将不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多