Apache:如何重写包含斜杠的 URL 编码路径?

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

我有一个注销链接,如下所示:

https://example.com/oauth2callback?logout=https%3A%2F%2Fexample.com%2Floggedout.html

换句话说,

/oauth2callback?logout=https://example.com/loggedout.html
,但它必须是 URL 编码的。这有点困难,所以我希望用户看到
https://example.com/keycloak/logout

为此,我添加了重写规则:

AllowEncodedSlashes On
RewriteRule ^/keycloak/logout$ /oauth2callback?logout=https%3A%2F%2Fexample.com%2Floggedout.html [L,QSA]

这行不通。 Apache日志显示,带有重写调试:

    init rewrite engine with requested uri /keycloak/logout, referer: https://example.com/
    ...
    applying pattern '^/keycloak/logout$' to uri '/keycloak/logout', referer: https://example.com/
    rewrite '/keycloak/logout' -> '/oauth2callback?logout=httpsAFFexample.comFloggedout.html', referer: https://example.com/
    split uri=/oauth2callback?logout=httpsAFFexample.comFloggedout.html -> uri=/oauth2callback, args=logout=httpsAFFexample.comFloggedout.html, referer: https://example.com/
    local path result: /oauth2callback, referer: https://example.com/
    prefixed with document_root to /var/www1/oauth2callback, referer: https://example.com/
    go-ahead with /var/www1/oauth2callback [OK], referer: https://example.com/

这最终会变成

404
- 我无法判断 Apache 这样做是因为正斜杠,还是因为 Keycloak 不理解查询字符串。请注意,
/oauth2callback
不是服务器上的真实位置 - 它由
mod_auth_openidc
在内部处理。我认为这可能是一个问题,所以我也尝试了
PT
标志,但没有帮助。

我已经尝试了很多这种方法的变体,使用

AllowEncodedSlashes
On
NoDecode
,以及其他标志,包括
R
B
。所有这些的日志都显示 Apache 正在生成一个类似于
logout=httpsAFFexample.comFloggedout.html
的查询字符串,因此编码似乎丢失了。有什么想法吗?

apache mod-rewrite mod-auth-openidc
1个回答
0
投票
AllowEncodedSlashes On
RewriteRule ^/keycloak/logout$ /oauth2callback?logout=https%3A%2F%2Fexample.com%2Floggedout.html [L,QSA]

您不需要

AllowEncodedSlashes
指令,因为编码的斜杠不在 URL 路径中(它们位于查询字符串中)。

但是,您确实需要对

%
substitution
字符串中的文字 RewriteRule 进行反斜杠转义,以防止
%3
%2
被视为反向引用(它们不存在 - 因此被视为空字符串) - 因此重写的 URL 中缺少字符,如 Apache(调试)日志中所示)。

例如:

RewriteRule ^/keycloak/logout$ /oauth2callback?logout=https\%3A\%2F\%2Fexample.com\%2Floggedout.html [QSA,L]
© www.soinside.com 2019 - 2024. All rights reserved.