nginx - 使用 Nginx 的规范 URL

标签 nginx seo rewrite config canonical-link

我们正在努力从我们的 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 的请求将按如下方式处理:

  1. 返回$uri = /foo/bar,如果该文件存在于文档中 根,否则
  2. 如果存在,最后返回$uri.html = /foo/bar.html
  3. 发出 404 错误。

关于nginx - 使用 Nginx 的规范 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7472953/

相关文章:

Laravel、Nginx 和 Docker 容器,权限被拒绝

Nginx与乘客

docker - 在 192.168.65.5 上查找 :53: no such host

CakePHP 全局 slug 路由器

html - 我的 hreflang 标签有什么问题?

.htaccess - 301重定向vs重写

javascript - Raspberry Pi 上的 Web 界面

ssl - 我如何将所有访问定向到 SSL 站点?

Python 性能——你是否曾经不得不用其他东西重写?

.htaccess URL 重写规则