2

我正在尝试将登录页面重定向到外部安全服务。此服务在验证凭据后,将使用引荐来源网址将用户返回到原始页面,如下例所示:

http://{IP NUMBER}/MyWiki/index.php?title=Special:UserLogin&returnto=Main_Page

或任何对站点中在 query_string 中包含 Special:UserLogin的页面的调用都需要重定向到:

https://login.security.server.com/test/UI/Login?service=DSSEC&goto=http://{IP NUMBER}/MyWiki/index.php/Special:UserLogin

我一直在使用 RewriteCond 和 RewriteRule 进行测试,但没有任何运气。

4

1 回答 1

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]

好的,这看起来有点令人困惑,但这就是正在发生的事情。

  1. 检查是否Special:UserLogin在请求 URI 或查询字符串中。
  2. 为标记、URI 和查询字符串创建反向引用匹配?(这非常重要)
  3. 将请求重定向到https://login.security.server.com/test/UI/Login,但使用来自先前条件的反向引用来构建goto=参数,并使用BURL 对反向引用进行编码的标志。这样,结果是一个完整的 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

完好无损。

于 2012-08-30T20:08:19.783 回答