在nginx上配置一些重写规则时,我正在撕掉我的头发。我在Debian Wheezy机器上运行nginx 1.2.1。
考虑以下树:
/
├── index.html
├── folder/
│ └── index.html
└── file.html
我希望这些文件由nginx提供,这样就不需要在URL中指定任何.html
,并且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(有和没有斜杠)会返回相同的内容。
每个配置都没有通过我的所有测试用例。
请注意,当我只是禁用2 rewrite
和try_files
,7
按预期应用时(以及1
,6
,{ {1}}但不是其他的),默认情况下重定向是有效的。我不明白这个重定向规则的方式和位置,所以这里是我的正式问题:如何重新显示此重定向,并且,通过扩展,我怎样才能使我的10个测试用例正常工作?
非常感谢 ,我的意思是:)
PS:我尽我所能,但当然如果有什么不清楚的地方,请不要犹豫要求澄清!答案 0 :(得分:2)
你有一些错误,首先你不会做任何301重定向,重定向正在使用,如果你正在访问的东西,但是你想要它去其他东西,例如,如果我们正在做升级。
http://example.com/index.html =>redirects to=> http://example.com/maintenance.html
你需要的是将某些内容的格式更改为其他内容,顺便交换你的重写,重写这样的工作
rewrite [what to match] [what to do with it]
您的重写说明当我获得/index.html
的网址时,它会重定向到/index
,然后会给您404
,因为您没有名为{{的真实文件1}}
我想用/index
try_files
试试这个并告诉我它是怎么回事。