如何从URL重定向和删除.html扩展名?

时间:2013-09-26 06:12:45

标签: redirect url-rewriting nginx

在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 rewritetry_files7按预期应用时(以及16,{ {1}}但不是其他的),默认情况下重定向是有效的。我不明白这个重定向规则的方式和位置,所以这里是我的正式问题:如何重新显示此重定向,并且,通过扩展,我怎样才能使我的10个测试用例正常工作?

非常感谢 ,我的意思是:)

PS:我尽我所能,但当然如果有什么不清楚的地方,请不要犹豫要求澄清!

1 个答案:

答案 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

试试这个并告诉我它是怎么回事。