我有一个带有一些外部链接的网站。他们都使用 target="_blank" 在新选项卡/窗口中打开。我想通过使用记录点击的内部链接来记录这些链接的点击,然后重定向到请求的外部 url。
我使用一个简单的 (jQuery) 函数重写链接的 href 如下:
$("a[target=_blank]").each(function() {
const href = $(this).href();
$(this).href("out/" + encodeURIComponent(href));
});
($.fn.href() 在别处定义)。
这导致与 hrefs 的链接,例如:
https://example.com/out/https%3A%2F%2Fwww.chartjs.org
到目前为止一切顺利。
现在我需要我的 .htaccess 将其重写为:
index.php?token=out&action=https%3A%2F%2Fwww.chartjs.org
我如何做到这一点?
我已经尝试了所有我能想到的,包括:
RewriteRule ^out/(.*)$ /index.php?token=out&action=$1 [L]
和
RewriteRule ^out/([^/]+)$ index.php?token=out&action=$1 [L]
但什么也做不了。
(我也尝试过使用 [L,B] 和 [L,QSA] 无济于事)。
任何帮助将不胜感激!
https://example.com/out/https%3A%2F%2Fwww.chartjs.org
像这样的 URL,在 URL 的 URL 路径部分带有编码斜杠(即
%2F
),默认情况下,将导致 404 响应 before 您在 .htaccess
中的指令能够处理请求.这是一个“安全”功能。
但是,您可以覆盖此行为并允许编码斜杠。但是,这只能在服务器配置中配置,而不是
.htaccess
。例如:
# In the <VirtualHost> or main server config
AllowEncodedSlashes NoDecode
有效值为
NoDecode
(首选)和On
。 (Off
是默认值。)
然后您可以在
.htaccess
中使用mod_rewrite来重写请求。例如:
RewriteEngine On
RewriteRule ^(out)/(.*) index.php?token=$1&action=$2 [B,L]
请注意,
RewriteRule
指令匹配的 URL 路径是 % 解码的,因此您需要在此处使用 B
标志对捕获的反向引用进行 URL 编码。
虽然,您可以重写为
index.php
(没有显式传递参数),而是在 PHP 中解析请求的 URL(即 $_SERVER['REQUEST_URI']
),而不是提取必要的信息。
或者,考虑在构建 URL 之前删除(或手动编码)
http(s)://
前缀,以避免 //
(或 %2F%2F
)开始出现在生成的 URL 中。 (当涉及到 mod_rewrite 时,URL 路径中的双斜杠也有问题。)此外,您仍然可能会遇到 URL 后面出现的斜杠的问题(尽管它们不一定 need 进行 URL 编码)。您甚至可以对生成的 URL 进行 base64 编码(在 JavaScript 中使用 btoa()
),然后在 PHP 中使用 base64_decode()
。