你想要这样的东西吗?
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 编码。(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
完好无损。