我对 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上述指令变得毫无用处,必须删除。
最后但并非最不重要的您应该意识到,这种重定向方法会带来安全/声誉风险,如上所述这里。