Mod 重写包含编码 URL 的 URL

问题描述 投票:0回答:1

我有一个带有一些外部链接的网站。他们都使用 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] 无济于事)。

任何帮助将不胜感激!

.htaccess mod-rewrite urlencode
1个回答
0
投票
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()

© www.soinside.com 2019 - 2024. All rights reserved.