.htaccess使用参数$ 1和$ 2重定向以形成URL

时间:2019-01-23 11:53:58

标签: php .htaccess redirect mod-rewrite

我正在尝试在.htaccess中完成以下规则。 我在domain1.com的根目录中有此.htaccess,并希望安排以下重定向domain1.com/index.php?domain2.com?page.html,它将所有访问者都带到domain2.com/page.html。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^
RewriteRule (.+)\.php\?(.+)\?(.+) http://$2/$3 [R=301,L]

已解决。 domain1.com/domain2.com/page.html

RewriteEngine On
RewriteCond %{HTTP_HOST} ^
RewriteRule (.+)\/(.+) http://$1/$2 [R=301,L]

1 个答案:

答案 0 :(得分:0)

与其构建像domain1.com/index.php?domain2.com?page.html之类的初始URL一样,它需要您捕获两个单独的反向引用(第二个?将进行URL编码)。最好按常规格式设置URL格式,如以下所示:

domain1.com.com/index.php?redirect=domain2.com/page.html

(不确定为什么要用?代替要传递的URL中的第一个斜杠吗?)

然后,您可以执行以下操作。请注意,您需要使用一个条件来检查QUERY_STRING服务器变量。

RewriteCond %{QUERY_STRING} ^redirect=([^&]+)
RewriteRule ^index\.php$ http://%1 [QSD,R,L]

%1是对最后匹配的 CondPattern 的反向引用。

需要QSD标志才能从请求中丢弃原始查询字符串。

但是,您需要在可以重定向到的域上执行其他验证,否则一旦发现恶意意图,它可能会被滥用。


更新:

RewriteCond %{HTTP_HOST} ^
RewriteRule (.+)\/(.+) http://$1/$2 [R=301,L]

此处的RewriteCond指令不执行任何操作。如果要验证是否存在Host标头(即不是HTTP / 1.0请求),则应将正则表达式^更改为.(仅是一个点)。但是,如果您在共享服务器上,则此测试可能是多余的。

如果目标主机名与源主机名相同,则使用URl路径,这将“中断”。