我有一个注销链接,如下所示:
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
的查询字符串,因此编码似乎丢失了。有什么想法吗?
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]