我正在尝试在.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]
答案 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路径,这将“中断”。