.htaccess 修改重写包含编码URL的URL

83qze16e  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(103)

我有一个网站,有几个外部链接。它们都使用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])。
任何帮助将不胜感激!

uxh89sit

uxh89sit1#

https://example.com/out/https%3A%2F%2Fwww.chartjs.org

一个像这样的URL,带有编码的斜杠(即。%2F)在URL的URL路径部分,默认情况下,在.htaccess中的指令能够处理请求之前,会导致404响应。这是一个“安全”功能。
但是,您可以覆盖此行为并允许编码斜杠。但是,这只能在server-config中配置,而不是.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(不显式传递参数),而是解析请求的URL(即$_SERVER['REQUEST_URI'])来提取必要的信息。
或者,考虑在构建URL之前删除(或手动编码)http(s)://前缀,以避免//(或%2F%2F)出现在生成的URL中。(URL路径中的双斜杠在mod_rewrite中也有问题。)此外,您仍然可能会遇到URL中稍后出现的斜杠的问题(尽管它们不一定 * 需要 * 进行URL编码)。你甚至可以用base64编码结果URL(在JavaScript中使用btoa()),然后在PHP中使用base64_decode()

相关问题