nginx 的 rewrite(URL重写)
申请微信开放平台的 第三方平台(门槛比想象中要低),配置授权后的响应接口路径,要求格式如下
通过该URL接收公众号或小程序消息和事件推送,该参数按规则填写(需包含/
$APPID$
,如www.abc.com/$APPID$
/callback),实际接收消息时$APPID$
将被替换为公众号或小程序AppId。
如果授权到我平台的公众号ID是 gh_abcdefg01234,而我处理公众号消息的程序是 wx.php。授权后,开放平台会把事件和消息推送到
http(s)://mydomain.com/path/gh_abcdefg01234/wx.php
为每一个授权的公众号都物理地部署一个响应脚本不是一个好主意,甚至是一场运维灾难。所以,考虑用rewrite 把公众号的ID 变为 参数推给统一的接口进行处理。
首先我改了设置,把事件和消息接口定义为
https://mydomain.com/wxserivce/$APPID$
然后修改 nginx.conf 的 server {} 部分添加以下规则
#rewrite of wx_3rd_app
location /wxservice/
{
if (!-e $request_filename)
{
rewrite ^/wxservice\/([^\/]+?)(\/|$) /wxservice/3rd/wx.php?wxid=$1 last;
}
}
解读以上脚本location /wxservice/
当请求这个路径时进行检测if (!-e $request_filename)
如果请求的文件不存在,则触发重写规则rewrite ^/wxservice\/([^\/]+?)(\/|$) /wxservice/3rd/wx.php?wxid=$1 last;
重写 /wxservice/XXXX/ 把 XXXX 作为参数从定向到 /wxservice/3rd/wx.php?wxid=XXXX 且不是永久重定向(对浏览器而言地址栏显示路径不改变)
也就是说请求
https://mydomain.com/wxserivce/gh_abcdefg01234
等效于请求
https://mydomain.com/wxservice/3rd/wx.php?wxid=gh_abcdefg01234
其实也差别不大,就是看起来逼格有点点不同(误,其实是有现实意义的)
后续:
想尝试修改上例的正则表达式,把请求
/debug/rewrite/xxxxx/fake.php
重写到
/debug/rewrite/get.php?q=xxxxx
规则这样写
rewrite ^/debug\/rewrite\/([^\/]+?)\/fake\.php$ /debug/rewrite/get.php?q=$1 last;
无效报404
检查了很久,怀疑自己对正则表达式的理解和造诣未深(确实是)..最后发现问题不在于正则表达式上
而是后续的php配置和这里产生冲突,证据是重写的最后FLAG last
改为 break
不再匹配后续规则的话,前面的正则匹配没有问题,但PHP的解析却无效了,浏览器直接提示下载了 get.php 的源码。
所以还是得放弃,不用 *.php
结尾则没有问题,替换中段的参数没问题
相关的参考资料
