所以,我找到了在我的页面上删除.html扩展名的答案,该代码可以正常工作:
server {
listen 80;
server_name _;
root /var/www/html/;
index index.html;
if (!-f "${request_filename}index.html") {
rewrite ^/(.*)/$ /$1 permanent;
}
if ($request_uri ~* "/index.html") {
rewrite (?i)^(.*)index\.html$ $1 permanent;
}
if ($request_uri ~* ".html") {
rewrite (?i)^(.*)/(.*)\.html $1/$2 permanent;
}
location / {
try_files $uri.html $uri $uri/ /index.html;
}
}
但如果我打开mypage.com,它会将我重定向到mypage.com/index 通过将index.html声明为索引来解决这个问题吗?任何帮助表示赞赏。
更新的答案:这个问题激起了我的好奇心,我继续寻找另一个更深入的搜索,为nginx中的.html
重定向提供“圣杯”解决方案。这是我找到的答案的链接,因为我自己没有提出它:https://stackoverflow.com/a/32966347/4175718
但是,我将举例说明它是如何工作的。这是代码:
location / {
if ($request_uri ~ ^/(.*)\.html$) {
return 302 /$1;
}
try_files $uri $uri.html $uri/ =404;
}
这里发生的事情是对if
指令的非常巧妙的使用。 Nginx在传入请求的$request_uri
部分运行正则表达式。正则表达式检查URI是否具有.html扩展名,然后将URI的无扩展部分存储在内置变量$1
中。
从docs,因为我花了一段时间来弄清楚$1
来自哪里:
正则表达式可以包含可供以后在$ 1 .. $ 9变量中重用的捕获。
正则表达式都检查是否存在不需要的.html请求,并有效地清理URI,使其不包含扩展名。然后,使用简单的return
语句,请求被重定向到现在存储在$1
中的已清理的URI。
正如原作者cnst解释的那样,最好的部分就是这样
由于$ request_uri在每个请求中始终是常量,并且不受其他重写的影响,因此事实上它不会形成任何无限循环。
与对任何.html
请求(包括对/index.html
的不可见内部重定向)进行操作的重写不同,此解决方案仅对用户可见的外部URI进行操作。
你仍然需要try_files
指令,否则Nginx将不知道如何处理新近消毒的无扩展URI。上面显示的try_files
指令将首先尝试新的URL,然后使用“.html”扩展名进行尝试,然后将其作为目录名称进行尝试。
Nginx文档还解释了默认的try_files
指令是如何工作的。默认的try_files
指令的排序方式与上面的示例不同,因此下面的解释并不完美排列:
Nginx将首先将
.html
附加到URI的末尾并尝试提供它。如果找到合适的.html
文件,它将返回该文件并保留无扩展URI。如果它找不到合适的.html
文件,它将尝试没有任何扩展名的URI,然后将URI作为目录,然后最终返回404错误。
上面的答案涉及正则表达式的使用,但对于那些仍然很好奇的人来说,这里有一个更具体的解释。使用以下正则表达式(正则表达式):
^/(.*)\.html$
这打破了:
^
:表示行的开头。
/
:字面上匹配字符“/”。正斜杠不需要在Nginx中进行转义。
(.*)
:捕获组:无限次匹配任何角色
\.
:匹配字符“。”从字面上。必须使用反斜杠进行转义。
html
:字面上匹配字符串“html”。
$
:表示行尾。
捕获组(.*)
包含URL的非“.html”部分。稍后可以使用变量$1
来引用它。然后Nginx被配置为重新尝试请求(return 302 /$1;
),并且try_files
指令在内部重新附加“.html”扩展名,以便可以找到该文件。
要保留传递给.html
页面的查询字符串和参数,可以将return
语句更改为:
return 302 /$1?$args;
这应该允许/index.html?test
等请求重定向到/index?test
而不仅仅是/index
。
来自Nginx页面如果是邪恶:
如果在位置上下文中,可以在内部完成的唯一100%安全的事情是:
回来......;
重写...最后;
301
重定向是永久性的,并由Web浏览器和搜索引擎缓存。如果您的目标是从已经被搜索引擎索引的网页中永久删除.html
扩展程序,则需要使用301
重定向。但是,如果您在实际站点上进行测试,最好先从302
开始,只有在绝对确信您的配置正常工作时才转移到301
。
这通常也适合我,并且由于工作中的配置,位置块充其量是最好的并且/&.php块被锁定。这意味着大多数解决方案对我不起作用。
所以这是我从上面接受的答案中简化的一个。
rewrite ^/(.*)\.html /$1/ permanent;
适用于CMS,底层框架正在生成页面