我正在尝试将登录页面重定向到外部安全服务。验证凭据后,此服务将使用引用网址将用户返回到原始页面,如下例所示:
http://{IP NUMBER}/MyWiki/index.php?title=Special:UserLogin&returnto=Main_Page
或者对query_string中包含特殊:UserLogin 的网站中的页面的任何调用都需要重定向到:
https://login.security.server.com/test/UI/Login?service=DSSEC&goto=http://{IP NUMBER}/MyWiki/index.php/Special:UserLogin
我一直在用RewriteCond和RewriteRule进行测试而没有任何运气。
答案 0 :(得分:1)
你想要这样的东西吗?
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或查询字符串中。?
标记,URI和查询字符串创建反向引用匹配(这非常重要)https://login.security.server.com/test/UI/Login
,但使用之前条件的后向引用构建goto=
参数,并使用 B
标记, URL对后向引用进行编码。这样,结果就是整个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://123.45.67.89/MyWiki/index.php%3ftitle%3dSpecial%3aUserLogin%26returnto%3dMain_Page
如您所见,查询字符串?title=Special:UserLogin&returnto=Main_Page
被编码为%3ftitle%3dSpecial%3aUserLogin%26returnto%3dMain_Page
,因此 login.security.server.com 不会将其误认为是自己的请求参数。相反,他们的登录服务会将goto参数视为:
http://123.45.67.89/MyWiki/index.php?title=Special:UserLogin&returnto=Main_Page
完全完好无损。