Redirect 如何重定向并从URL中删除.html扩展名?
在nginx上配置一些重写规则时,我对这一点非常恼火。我正在Debian喘息机上运行nginx1.2.1 考虑到以下因素: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的任何调用都会在索引中重写 这是这个描述的正式版本。请求示例位于左侧,我尝试获取的相应响应
/
├── 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(带和不带尾随斜杠)返回相同的内容
每个配置并没有通过我所有的测试用例
请注意,当我简单地禁用2rewrite
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;
}