一、问题情况
遇到一个IIS的web.config的rewrite的规则转换nginx规则的问题
二、解决办法
首先可以用个现成的工具转换一下rewrite规则:https://www.toolnb.com/tools/rewriteTools.html
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="pic"> <match url="^pic/allimg/(.*)$" /> <action type="Rewrite" url="pic/a/{R:1}" /> </rule> <rule name="img" stopProcessing="true"> <match url="^img/(.*)$" /> <action type="Rewrite" url="https://www.1987619.com/img/{HTTP_HOST}/{R:1}" /> </rule> </rules> </rewrite> </system.webServer> </configuration> |
转换后
1 2 |
rewrite 'pic/allimg/(.*)' pic/a/$1 last; rewrite 'img/(.*)' https://www.1987619.com/img/{HTTP_HOST/$1 last; |
但是上面有两点问题,就是iis里的rewrite规则^后直接跟路径不需要写/,转换后的nginx规则也就没有/开头.可以自己补齐一下,还有就是{HTTP_HOST}这类的变量转换不对修正下:
1 2 |
rewrite '/pic/allimg/(.*)' /pic/a/$1 last; rewrite '/img/(.*)' https://www.1987619.com/img/$HTTP_HOST/$1 last; |
测试后发现又遇到一些新问题
APACHE里301和302跳转转nginx规则会变成last,也需要修正,还有APACHE的NC忽略GBK字符转换中文,这个IIS的URL REWITE无法实现这个,开了双重字符转义也不正常,最后还是用了IIS的ISAPI_REWRITE才可以用NC方法.
IIS下直接写域名重写以后是浏览器里依旧显示当前访问的url,实际内容被反代到重写的域名地址上的(安装了Application Request Routing(ARRv3.0)).但是nginx里rewrite如果后面写域名的话,实际是302重定向跳转到了域名地址上去.而不是反代.查了下nginx的rewrite的last只对相对地址才进行重写,尝试了break也是一样的.如果写了域名默认就只能302重定向跳转了.这样肯定不符合我们的要求.所以需要改造一下:
反代proxy_pass地址可以参考:https://blog.csdn.net/u010433704/article/details/99945557
1 2 3 4 5 6 7 8 9 |
location ~* ^/img/(.*) { rewrite /img/(.*) /img/$HTTP_HOST/$1 break; proxy_pass https://www.1987619.com; proxy_ssl_server_name on; proxy_ssl_session_reuse on; proxy_set_header Host www.1987619.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } |
如果需要参数数值用于变量,正则匹配变量的方法:http://t.zoukankan.com/chenjw-note-p-14388257.html
或者直接rewrite里匹配需要的参数也可以:https://blog.csdn.net/aerchi/article/details/84068768
这样就可以实现像IIS那样直接写域名的重写反代操作了.需要的可以参考下