我们正在努力从我们的 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]
我已经阅读了文档并尝试了几个不同的选项 - 我能得到的最接近的选项仍然会返回无限循环错误。
最佳答案
您为 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
的请求将按如下方式处理:
- 返回
$uri
=/foo/bar
,如果该文件存在于文档中 根,否则 - 如果存在,最后返回
$uri.html
=/foo/bar.html
- 发出 404 错误。
关于nginx - 使用 Nginx 的规范 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7472953/