使用 Apache 2 重定向到查询字符串中传递的 URL

使用 Apache 2 重定向到查询字符串中传递的 URL

我对 URL 重定向还不是很熟悉,我想创建这种重定向http://example.com/?url=http://domain.test/http://domain.test/

我目前得到的结果是:http://example.com/?url=http://domain.test/ 重定向到http://domain.test/?url=http://domain.test/

但我不想要这个?url=http://domain.test/角色。

我的Apache2虚拟主机的相关部分是:

RewriteCond %{QUERY_STRING} url=(.*)
RewriteRule "/" "%1" [QSA,R=301,L]

我搜索了很多论坛但仍然找不到我需要的东西。

答案1

您已经接近解决方案了。您需要删除原始查询字符串,因为QSD旗帜(支持Apache httpd2.4.0及更高版本)。

因此,为了实现你的目标,你可以使用这些Apache httpd指令:

# Tested with Apache 2.4.38
RewriteCond %{QUERY_STRING} ^url=(.*)
RewriteRule ^ %1 [QSD,NE,R=301,L]

有趣的是,该解决方案支持本身具有查询字符串的 URL,例如http://example.com/?url=http://domain.test/?lang=en

要处理传递的经过编码的 URL(例如:)http://example.com/?url=http%3A%2F%2Fdomain.test%2F%3Flang%3Den,最简单的方法可能是使用这种小脚本来处理传递的 URL:

<?php
# WARNING: Add some security checks to prevent exploits like https://www.securityfocus.com/bid/55297/exploit
header('Location: '.$_GET['url']); # $_GET members are automatically passed through urldecode().
?>

如果您选择使用此脚本,那么Apache httpd上述指令变得毫无用处,必须删除。

最后但并非最不重要的您应该意识到,这种重定向方法会带来安全/声誉风险,如上所述这里

相关内容