如何使用APACHE重写规则将带有查询字符串的页面重定向到外部网页
我正在尝试将登录页重定向到外部安全服务。验证凭据后,此服务将使用referer url将用户返回到原始页面,如下例所示:如何使用APACHE重写规则将带有查询字符串的页面重定向到外部网页,apache,mod-rewrite,Apache,Mod Rewrite,我正在尝试将登录页重定向到外部安全服务。验证凭据后,此服务将使用referer url将用户返回到原始页面,如下例所示: http://{IP NUMBER}/MyWiki/index.php?title=Special:UserLogin&returnto=Main_Page 或者,对网站中查询字符串中包含Special:UserLogin的页面的任何调用都需要重定向到: https://login.security.server.com/test/UI/Login?service=
http://{IP NUMBER}/MyWiki/index.php?title=Special:UserLogin&returnto=Main_Page
或者,对网站中查询字符串中包含Special:UserLogin的页面的任何调用都需要重定向到:
https://login.security.server.com/test/UI/Login?service=DSSEC&goto=http://{IP NUMBER}/MyWiki/index.php/Special:UserLogin
https://login.security.server.com/test/UI/Login?service=DSSEC&goto=http://123.45.67.89/MyWiki/index.php%3ftitle%3dSpecial%3aUserLogin%26returnto%3dMain_Page
我一直在用RewriteCond和RewriteRule进行测试,但运气不好。你想要这样的东西吗
RewriteEngine On
RewriteCond %{REQUEST_URI} Special:UserLogin [OR]
RewriteCond %{QUERY_STRING} Special:UserLogin
RewriteCond ?#%{QUERY_STRING} ([^#]+)#([^#]+)
RewriteRule ^ https://login.security.server.com/test/UI/Login?service=DSSEC&goto=http://%{SERVER_ADDR}%{REQUEST_URI}%1%2 [L,B,NE]
好吧,这看起来有点让人困惑,但事情是这样的
Special:UserLogin
?
标记、URI和查询字符串创建反向引用匹配(这非常重要)https://login.security.server.com/test/UI/Login
,但使用前一个条件中的反向引用来构建goto=
参数,并使用B
标志,该标志由URL编码反向引用。这样,结果就是一个完整的URL,以及一个经过URL编码的查询字符串。(存在NE
标志以确保%
符号本身不会被双重编码)/MyWiki/index.php?title=Special:UserLogin&returnto=Main_Page
将被重定向到:
https://login.security.server.com/test/UI/Login?service=DSSEC&goto=http://{IP NUMBER}/MyWiki/index.php/Special:UserLogin
https://login.security.server.com/test/UI/Login?service=DSSEC&goto=http://123.45.67.89/MyWiki/index.php%3ftitle%3dSpecial%3aUserLogin%26returnto%3dMain_Page
正如您所看到的,查询字符串?title=Special:UserLogin&returnto=Main\u Page
被编码到%3ftitle%3dsspecial%3userlogin%26returnto%3dman\u Page
,这样login.security.server.com就不会将其误认为自己的查询字符串。相反,他们的登录服务将看到goto参数:
http://123.45.67.89/MyWiki/index.php?title=Special:UserLogin&returnto=Main_Page
完好无损