1

我们正在努力从我们的 URL 中删除目录索引文件以清理内容并提供更高的一致性以改进我们的 SEO。

但是,我不熟悉如何在 Nginx 中处理这个问题。

我为 Apache 找到了以下内容(我们只是在寻找 Nginx 等价物)

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*index\.php\ HTTP/ 
RewriteRule     ^(([^/]+/)*)index\.php$ http://www.%{HTTP_HOST}/ [R=301,NS,L]  

我已经阅读了文档并尝试了几种不同的选项——我能得到的最接近的选项仍然会返回无限循环错误。

4

1 回答 1

2

您为 Apache 发布的代码段使用不可变的全局变量%{THE_REQUEST}来确定客户端请求的原始 URI。但是,此变量包含整个请求,包括 HTTP 方法、版本和查询字符串。因此,解析此变量有点混乱,如您发布的示例所示。

但是,nginx有一个专用变量来保存从客户端收到的原始请求 URI:$request_uri. 这允许您执行以下操作:

## REDIRECT foo/index(.html) to foo/
if ($request_uri ~ ^(.*/)index(?:\.html)?$) {
    return 301 $1;
}

如果您还想去除文件后缀,例如.html,您可以使用以下代码段:

## REDIRECT foo/bar.html to foo/bar
if ($request_uri ~ ^(.+)\.html$) {
    return 301  $1;
}

现在,为了nginx仍然能够提供正确的文件,使用该try_files指令,该指令依次检查所有给定的 URI,直到匹配:

## Rewrite internal requests for foo/bar to foo/bar.html
try_files $uri $uri.html =404;

因此,请求/foo/bar将按如下方式处理:

  1. return $uri= /foo/bar,如果该文件存在于文档根目录中,否则
  2. return $uri.html=/foo/bar.html如果存在,最后
  3. 发出 404 错误。
于 2012-07-06T19:26:58.917 回答