比较这两个RedirectMatch
。第一个不起作用:
RedirectMatch 302 ^/redirect\.php[?]page=(.+)$ http://somewhereelse.com/$1
与此相比,它将重定向到http://somewhereelse.com/?page=wherever
:
RedirectMatch 302 ^/redirect\.php([?]page=.+)?$ http://somewhereelse.com/$1
是否RedirectMatch
只匹配 URI 而不匹配查询字符串?Apache 的文档在这方面有点模糊。我试要做的是提取page
查询参数并使用它重定向到另一个站点。
这可能吗?RedirectMatch
或者我必须使用RewriteCond
+吗RewriteRule
?
答案1
不幸的是,在这种情况下无法使用RedirectMatch
;查询字符串不是RewriteMatch
所比较的 URL 字符串的一部分。
第二个示例之所以有效,是因为客户端发送的查询字符串被重新附加到目标 URL - 因此可选匹配不匹配任何内容,替换$1
为空字符串,但客户端的原始查询字符串又被卡住了。
相反,需要RewriteCond
对遗嘱进行检查。%{QUERY_STRING}
RewriteCond %{QUERY_STRING} page=([^&]+)
RewriteRule ^/redirect\.php$ http://somewhereelse.com/%1? [R=302,L]
答案2
根据文档,它与 URL 匹配:
提供的正则表达式与 URL 路径匹配
http://httpd.apache.org/docs/current/mod/mod_alias.html#redirectmatch
每个 URL 均由以下内容组成:方案名称(通常称为协议),后跟一个冒号、两个斜杠,然后根据方案,后跟一个服务器名称(例如 ftp.、www.、smtp. 等)和一个点(.),然后是域名(或者 IP 地址)、端口号、要获取的资源或要运行的程序的路径,然后是对于诸如通用网关接口 (CGI) 脚本之类的程序,查询字符串和可选的片段标识符。
http://en.wikipedia.org/wiki/Uniform_Resource_Locator (语法部分)
你可以用 RewriteRule 来做到这一点