在 nginx 上配置一些重写规则时,我正在为此烦恼。我在 Debian Wheezy 机器上运行 nginx 1.2.1。
考虑以下树:
/
├── index.html
├── folder/
│ └── index.html
└── file.html
我希望这些文件由 nginx 提供,这样就不需要.html
在 URL 中指定任何内容,并且对 a 的任何调用都folder/index.html
被重写为folder/
,任何对的调用都file.html
被重写为index
.
这是此描述的正式版本。请求示例在左侧,我尝试获取的相应响应在右侧(HTTP 代码 301 + 重定向位置或 HTTP 代码 200 + 要显示的文件):
1. http://example.com/ -> 200 (/index.html)
2. http://example.com/index.html -> 301 http://example.com/
3. http://example.com/index -> 301 http://example.com/
4. http://example.com/file -> 200 (/file.html)
5. http://example.com/file.html -> 301 http://example.com/file
6. http://example.com/folder/ -> 200 (/folder/index.html)
7. http://example.com/folder -> 301 http://example.com/folder/
8. http://example.com/folder/index.html -> 301 http://example.com/folder/
9. http://example.com/folder/index -> 301 http://example.com/folder/
10. http://example.com/foobar -> 404
到目前为止,我最接近的尝试是以下配置/etc/nginx/sites-enabled/example.com
:
server {
server_name example.com;
root /var/www/example.com/public_html;
rewrite ^(.*/)index(\.html)*$ $1 permanent; # Applies to 2, 3, 8, 9
rewrite ^(/.+)\.html$ $1 permanent; # Applies to 5
try_files $uri $uri.html "${uri}index.html" =404; # Handles 1, 4, 6, 10
}
如您所见,7
缺少案例。现在,我得到了:
7'. http://example.com/folder -> 404
我还设法拥有:
7''. http://example.com/folder -> 200 (/folder/index.html)
但这绝对是我不希望 SEO 明智的事情(除其他外),因为 2 个不同的 URL(带和不带斜杠)返回相同的内容。
每个配置都没有通过我所有的测试用例。
请注意,当我简单地禁用 2rewrite
并且try_files
,7
按预期应用(以及1
, 6
,10
但不是其他的)时,默认情况下重定向是有效的。我不明白这个重定向规则是如何以及在哪里出现的,所以这是我的正式问题:我怎样才能让这个重定向重新出现,进而,我怎样才能让我的 10 个测试用例正常工作?
非常感谢,我是认真的:)
PS:我尽我所能,当然如果有什么不清楚的,请不要犹豫,要求澄清!