解决Nginx中location匹配不到末尾不加斜杠的URL

Nginx中配置location的匹配规则时,相信大家都遇到过 URL 去掉末尾斜杠(/)匹配失败的情况。

我们先来举例描述一下这个问题。

example配置

假设我们配置是这样:

server {
	listen 80
	server_name xxx.com
	...
	...
	location /yyy {
    	root /home/projects;
		index  index.html index.htm;
   }
	...
	...
}
复制代码

那么,如果我们访问 xxx.com/yyy/ ,会匹配到服务器上/home/projects/yyy文件夹,并打开index.html或者index.htm文件。

而当我们访问 xxx.com/yyy ,你会发现,匹配失败

这种情况下,你当然可以祈祷用户能够每次输入这个 URL 的时候都带上(/),但是说实在的,我估计你每次打开百度的时候都是直接输入 www.baidu.com 而不会加斜杠输入 www.baidu.com/ 。末尾斜杠显得如此多此一举。

那如何才能解决这个问题呢?

解决思路

既然加了斜杠可以匹配,那么,我们就可以对不加斜杠的 URL 进行重写,给它加上末尾斜杠,然后重定向,不就解决问题了。

这里,我们需要用到 Nginx 中 ngx_http_rewrite_module 这个 module。

首先,我们判断请求资源是否是请求目录类型

if ( -d $request_filename )
复制代码

然后我们利用正则来匹配、替换,并用rewritepermanent来重定向(301)

rewrite ^/(.*)([^/])$ $scheme://$host/$1$2/ permanent;
复制代码

正确配置

修改配置如下

server {
	listen 80
	server_name xxx.com
	...
	...
	location /yyy {
    	root /home/projects;
	   	if ( -d $request_filename ){
			rewrite ^/(.*)([^/])$ $scheme://$host/$1$2/ permanent;
		}
		index  index.html index.htm;
   }
	...
	...
}
复制代码

然后验证配置是否有错误

$ nginx -t 
复制代码

如果没有语法错误,会提示

/nginx.conf syntax is ok

最后重启看效果

$ nginx -s reload
复制代码
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值