2011-09-19 68 views
1

我们正在努力从我们的URL中移除目录索引文件来清理事物并提供更多一致性来改进我们的SEO。Nginx的Canonical URLs

但是,我不熟悉如何在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

您为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错误。
+0

很好的回应。欢迎来到堆栈溢出! – GargantuChet