如何使用APACHE RewriteRule将带有查询字符串的页面重定向到外部网页

时间:2012-08-30 17:10:58

标签: apache mod-rewrite

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

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进行测试而没有任何运气。

1 个答案:

答案 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]

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

  1. 检查Special:UserLogin是否在请求URI或查询字符串中。
  2. ?标记,URI和查询字符串创建反向引用匹配(这非常重要)
  3. 将请求重定向到https://login.security.server.com/test/UI/Login,但使用之前条件的后向引用构建goto=参数,并使用 B 标记, URL对后向引用进行编码。这样,结果就是整个URL以及查询字符串,这些URL已经过URL编码。 (NE标志用于确保%符号本身不会被双重编码。)
  4. 根据这些规则,请求:

    /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
    

    完全完好无损。