【问题标题】:Canonical URLs with Nginx使用 Nginx 的规范 URL
【发布时间】:2011-11-20 08:07:48
【问题描述】:

我们正在努力从我们的 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]  

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

【问题讨论】:

    标签: nginx seo rewrite config canonical-link


    【解决方案1】:

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

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

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

    如果您还想去掉文件后缀,例如.html,你可以使用下面的sn-p:

    ## 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 错误。

    【讨论】:

    • 反响很好。欢迎使用 Stack Overflow!
    猜你喜欢
    • 2011-08-04
    • 2020-10-11
    • 1970-01-01
    • 2012-05-22
    • 2020-06-16
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多