首页 > 解决方案 > 带有参数 $1 和 $2 的 .htaccess 重定向以形成 URL

问题描述

我正在尝试在我的 .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]

标签: php.htaccessredirectmod-rewrite

解决方案


而不是构建您的初始 URL,例如domain1.com/index.php?domain2.com?page.html- 这需要您捕获两个单独的反向引用(第二个?将是 URL 编码的)。最好以更常规的方式格式化您的 URL,如下所示:

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

(不确定为什么要用 a 代替?正在传递的 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 路径,如果目标主机名与源主机名相同,这将“中断”。


推荐阅读