使用Nginx的规范URL

时间:2011-09-19 15:00:08

标签: nginx seo rewrite config canonical-link

我们正在努力从我们的网址中删除目录索引文件以清理内容并提供更多一致性以改善我们的搜索引擎优化。

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

我发现Apache的以下内容(我们只是寻找Nginx的等价物)

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

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

1 个答案:

答案 0 :(得分: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. 如果文件中存在该文件,则返回$uri = /foo/bar root,否则
  2. 如果存在则返回$uri.html = /foo/bar.html,最后
  3. 发出404错误。