Redirect 如何重定向并从URL中删除.html扩展名?

Redirect 如何重定向并从URL中删除.html扩展名?,redirect,url-rewriting,nginx,Redirect,Url Rewriting,Nginx,在nginx上配置一些重写规则时,我对这一点非常恼火。我正在Debian喘息机上运行nginx1.2.1 考虑到以下因素: / ├── index.html ├── folder/ │ └── index.html └── file.html 我希望这些文件由nginx提供服务,这样就不需要在URL中指定任何.html,并且对文件夹/index.html的任何调用都会在文件夹/中重写,对文件.html的任何调用都会在索引中重写 这是这个描述的正式版本。请求示例位于左侧,我尝试获取的相应响应

在nginx上配置一些重写规则时,我对这一点非常恼火。我正在Debian喘息机上运行nginx1.2.1

考虑到以下因素:

/
├── index.html
├── folder/
│   └── index.html
└── file.html
我希望这些文件由nginx提供服务,这样就不需要在URL中指定任何
.html
,并且对
文件夹/index.html
的任何调用都会在
文件夹/
中重写,对
文件.html
的任何调用都会在
索引中重写

这是这个描述的正式版本。请求示例位于左侧,我尝试获取的相应响应位于右侧(要显示的HTTP代码301+重定向位置或HTTP代码200+文件):

到目前为止,我最近的尝试是对
/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明智的事情(除其他外),因为两个不同的URL(带和不带尾随斜杠)返回相同的内容

每个配置并没有通过我所有的测试用例

请注意,当我简单地禁用2
rewrite
s和
try\u文件时,
7
按预期应用(以及
1
6
10
,但不包括其他文件),默认情况下重定向是有效的。我不明白这个重定向规则是如何以及在何处出现的,所以这里是我的正式问题:我如何才能使这个重定向重新出现,以及如何让我的10个测试用例正常工作

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


PS:我尽了最大努力,但当然如果有任何不清楚的地方,请不要犹豫要求澄清

有几件事你搞错了,首先你不会做任何301重定向,如果你正在访问某个东西,就会使用重定向,然后你想让它转到其他地方,例如,如果我们正在进行升级

http://example.com/index.html =>redirects to=> http://example.com/maintenance.html
你需要的是将某种东西的格式改成另一种形式,顺便说一下,你的重写是交换的,重写是这样工作的

rewrite [what to match] [what to do with it]
你的重写是说,当我得到
/index.html
的URL时,它会重定向到
/index
,然后会给你一个
404
,因为你没有一个名为
/index
的真正文件

我想用
try\u文件来做

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

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

Try_files
指令实际上是在文件系统上查找文件,因此
/page
将加载
/page.html
例如,但是如果没有
重写
指令,
/page.html
将不会像预期的那样重定向到
/page
。两个URL都会响应。另外,我不明白你为什么说我的
重写
被替换了,因为它们符合你的要求。
server {
    server_name example.com www.example.com;
    root /my/root/path;
    location / {
        try_files $uri $uri/ $uri.html;
    }