nginx隐藏html后缀

1. nginx隐藏html后缀

nginx配置文件中添加以下代码

1
2
3
4
5
6
7
location / {
if ($request_uri ~ ^/(.*)\.html$) {
return 302 /$1$args;
}
index index.html;
try_files $uri $uri.html $uri/ =404;
}

html中将链接结尾的.html去除,否则还会显示后缀,或者说根本不会触发这条函数

1.1. 这里详细解释下

这里使用了if指令,让Nginx对$request_uri这个传入部分使用一个正则表达式,正则表达式检查URI链接是否有.html扩展名,没有就将URI的那部分存储在本地变量$1中,这个正则表达式同时会检测链接是否有.html的后缀,如果有就删除,最后再存到本地变量$1中并进行302跳转,$args保留参数比如请求的index.html?lang=en转换成了index?lang=en而不只是请求index,到这里就基本结束了

1.2. index

指定index文件的,没什么好说的吧

1.3. 那后面的try_files又有什么用呢?

如果没有try_files,Nginx将不知道如何处理新的无后缀uri(原来的后缀已经删了),它会对链接进行一个尝试,比如我们这里有个en,它会先找有没有/en这个文件,如果没有就找有没有en.html这个文件,如果没有就去到/en/index.html如果没有,最后返回404,如果没有这行代码那随便输个链接,可能就给你跳500了(500是指服务器内部错误)这行代码就能让你正常跳转到404

1.4. 详细讲下前面的正则表达式~ ^/(.*)\.html$

分开来写
^: 表示行首。
/: 逐字匹配字符/,Nginx中不需要转义正斜杠。
(.*): 抓取部分:无限次匹配任何字符
\.: 匹配字符.,反斜杠转义
html: 从字面上匹配字符串html
$: 表示行尾
(.*)包含了链接的非.html前半部分,之后用$1变量引用了,为了方便查找文件,这里又添加了.html后缀来匹配文件(原链接是没有.html后缀的)

1.5. 另外

代码中的302跳转是可以改成301
如果搜索引擎已经收录了带有.html后缀的网页后想要去除的话建议使用301跳转

欢迎关注我的其它发布渠道