2

在 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, 610但不是其他的)时,默认情况下重定向是有效的。我不明白这个重定向规则是如何以及在哪里出现的,所以这是我的正式问题:我怎样才能让这个重定向重新出现,进而,我怎样才能让我的 10 个测试用例正常工作?

非常感谢,我是认真的:)

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

4

1 回答 1

2

你有几件事错了,首先你不会做任何 301 重定向,如果你正在访问某些东西,重定向正在使用,但是你希望它转到其他东西,例如,如果我们正在进行升级。

http://example.com/index.html =>redirects to=> http://example.com/maintenance.html

您需要的是将某些内容的格式更改为其他内容,顺便交换您的重写,重写的工作方式如下

rewrite [what to match] [what to do with it]

你的重写是说当我得到一个 URL 时/index.html它会重定向到/index那个然后会给你一个404因为你没有一个真正的文件叫做/index

我想这样做try_files

server {
    server_name example.com www.example.com;
    root /my/root/path;
    location / {
        try_files $uri $uri/ $uri.html;
    }

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

于 2013-09-26T19:00:25.680 回答