RedirectMatch 和查询字符串

RedirectMatch 和查询字符串

比较这两个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 来做到这一点

相关内容