我有一个网站,有几个外部链接。它们都使用target="_blank”在一个新的选项卡/窗口中打开。我想记录这些链接的点击,通过使用一个内部链接,其中记录点击,然后重定向到所要求的外部网址。
我使用一个简单的(jQuery)函数重写链接的href,如下所示:
$("a[target=_blank]").each(function() {
const href = $(this).href();
$(this).href("out/" + encodeURIComponent(href));
});
($.fn.href()在别处定义)。
这将导致与href的链接,如:
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])。
任何帮助将不胜感激!
1条答案
按热度按时间uxh89sit1#
一个像这样的URL,带有编码的斜杠(即。
%2F
)在URL的URL路径部分,默认情况下,在.htaccess
中的指令能够处理请求之前,会导致404响应。这是一个“安全”功能。但是,您可以覆盖此行为并允许编码斜杠。但是,这只能在server-config中配置,而不是
.htaccess
。例如:有效值为
NoDecode
(首选)和On
。(默认值为Off
。)然后可以在
.htaccess
中使用mod_rewrite重写请求。例如:请注意,
RewriteRule
指令匹配的URL路径是%解码的,因此您需要在这里使用B
标志来对捕获的反向引用进行URL编码。但是,您可以只重写为
index.php
(不显式传递参数),而是解析请求的URL(即$_SERVER['REQUEST_URI']
)来提取必要的信息。或者,考虑在构建URL之前删除(或手动编码)
http(s)://
前缀,以避免//
(或%2F%2F
)出现在生成的URL中。(URL路径中的双斜杠在mod_rewrite中也有问题。)此外,您仍然可能会遇到URL中稍后出现的斜杠的问题(尽管它们不一定 * 需要 * 进行URL编码)。你甚至可以用base64编码结果URL(在JavaScript中使用btoa()
),然后在PHP中使用base64_decode()
。