php - 带有参数 $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]
解决方案
而不是构建您的初始 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 路径,如果目标主机名与源主机名相同,这将“中断”。
推荐阅读
- javascript - 使用 javascript 事件处理程序更改 html 输入图像
- react-native - 如何让视频播放器在世博会上做出反应?
- python - 使用来自不同时间序列的索引和值创建一个时间序列,具有不同的索引
- android - 使用 Android 导航组件在底部导航中的多个片段之间共享视图模型
- javascript - Node js - React:如何修改 API 以获取特定请求
- python - 是否可以使用 Python 在 Raspberry Pi 上提高 ADXL345 的采样率?
- django - 我想在 django annotate 中显示值的名称
- c# - C#将变量添加到路径
- android - 声明一堆可绘制对象(Kotlin)的最佳方法是什么?
- javascript - 如何将文件设置为 React 状态