标签 rewrite 下的文章

申请微信开放平台的 第三方平台(门槛比想象中要低),配置授权后的响应接口路径,要求格式如下

通过该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 结尾则没有问题,替换中段的参数没问题


相关的参考资料

https://www.cnblogs.com/likwo/p/6513117.html

https://blog.csdn.net/u014296316/article/details/81061490