有没有办法使用 mod_rewrite 进行重定向而不改变用户浏览器中的 URL?
[P]
我在最后看到了使用的解决方案RewriteRule
,但这对我来说不起作用。
我想要的是:
https://my-server.com/propostas/billy.joe
< ---> internally redirect to
https://my-server.com/subdir/propostas_usuarios/billy.joe
我拥有的:
<LocationMatch "/propostas/(?<username>[^/]+)">
RewriteEngine On
RewriteRule ^/([^/]+)(.*) /subdir/propostas_usuarios/%{env:MATCH_USERNAME}
</LocationMatch>
这是目前正在运行的。但重定向后,我可以/subdir/propostas_usuarios
在新的 URL 中看到。
[P]
我曾尝试过这样使用:
RewriteRule (.*) https://%{SERVER_NAME}/hpe/propostas_usuarios/%{env:MATCH_USERNAME} [P]
但这给了我这个错误:
[Fri Dec 11 16:02:57.945091 2020] [proxy:debug] [pid 16725:tid 140351293593344] mod_proxy.c(1253): [client 10.0.105.36:52700] AH01143: Running scheme https handler (attempt 0)
[Fri Dec 11 16:02:57.945102 2020] [proxy_ajp:debug] [pid 16725:tid 140351293593344] mod_proxy_ajp.c(744): [client 10.0.105.36:52700] AH00894: declining URL https://my-server.com/subdir/propostas_usuarios/billy.joe
[Fri Dec 11 16:02:57.945124 2020] [proxy_fcgi:debug] [pid 16725:tid 140351293593344] mod_proxy_fcgi.c(1032): [client 10.0.105.36:52700] AH01076: url: https://my-server.com/subdir/propostas_usuarios/billy.joe proxyname: (null) proxyport: 0
[Fri Dec 11 16:02:57.945131 2020] [proxy_fcgi:debug] [pid 16725:tid 140351293593344] mod_proxy_fcgi.c(1035): [client 10.0.105.36:52700] AH01077: declining URL https://my-server.com/subdir/propostas_usuarios/billy.joe
[Fri Dec 11 16:02:57.945149 2020] [proxy:debug] [pid 16725:tid 140351293593344] proxy_util.c(2338): AH00942: HTTPS: has acquired connection for (*)
[Fri Dec 11 16:02:57.945159 2020] [proxy:debug] [pid 16725:tid 140351293593344] proxy_util.c(2393): [client 10.0.105.36:52700] AH00944: connecting https://my-server.com/subdir/propostas_usuarios/billy.joe to my-server.com:443
[Fri Dec 11 16:02:57.946130 2020] [proxy:debug] [pid 16725:tid 140351293593344] proxy_util.c(2616): [client 10.0.105.36:52700] AH00947: connected /subdir/propostas_usuarios/billy.joe to my-server.com:443
[Fri Dec 11 16:02:57.946210 2020] [proxy:debug] [pid 16725:tid 140351293593344] proxy_util.c(3085): AH02824: HTTPS: connection established with 10.30.6.52:443 (*)
[Fri Dec 11 16:02:57.946233 2020] [proxy:error] [pid 16725:tid 140351293593344] AH00961: HTTPS: failed to enable ssl support for 10.30.6.52:443 (my-server.com)
[Fri Dec 11 16:02:57.946236 2020] [proxy:debug] [pid 16725:tid 140351293593344] proxy_util.c(2353): AH00943: HTTPS: has released connection for (*)
有任何想法吗?
答案1
该P
标志通过 mod_proxy 发送请求 - 这似乎不是必需的。您只需要内部重写到另一个子目录。
<LocationMatch "/propostas/(?<username>[^/]+)"> RewriteEngine On RewriteRule ^/([^/]+)(.*) /subdir/propostas_usuarios/%{env:MATCH_USERNAME} </LocationMatch>
这看起来应该可以工作 - 这里没有外部重定向,正如您所观察到的。但是,指令上没有L
(oe END
) 标志RewriteRule
,因此处理将继续,并且可能是后续指令触发了重定向?(虽然外部重定向实际上应该是前任何内部重写。
如果您还有一个.htaccess
文件(或<Directory>
容器),那么这些指令也会稍后处理,并可能触发重定向。(?)
该规则也可以“简化”——不需要包装器,因为它可以在一个指令<LocationMatch>
中完成。RewriteRule
例如:
RewriteEngine On
RewriteRule ^/propostas/([^/]+)$ /subdir/propostas_usuarios/$1 [L]
我在正则表达式上放置了一个字符串结尾锚点,否则它将匹配以下形式的 URL /propostas/billy.joe/anything
。$1
是对第一个捕获组的反向引用(即用户名) 在里面RewriteRule
图案。
如上所述,我添加了L
标志以防止处理当前上下文中的其他指令。但是,<Directory>
容器(和.htaccess
)中的指令仍将被处理。
如果您之前看到的是外部重定向,那么您需要在测试之前确保浏览器缓存已被清除。