
Есть ли способ сделать перенаправление с помощью 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
) будут по-прежнему обрабатываться.
Если ранее вы наблюдали внешнее перенаправление, то перед тестированием вам необходимо убедиться, что кэш браузера очищен.