Apache - перенаправление без изменения URL-адреса в браузере пользователя

Есть ли способ перенаправления с помощью 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
задан 12 December 2020 в 00:49
1 ответ

Флаг P отправляет запрос через mod_proxy, что здесь не требуется. Вам просто требуется внутренняя перезапись в другой подкаталог.

[^/]+)">
RewriteEngine включен
Правило перезаписи ^/([^/]+)(.*) /subdir/propostas_usuarios/%{env:MATCH_USERNAME}

Похоже, это должно работать — здесь нет внешнего перенаправления, как вы, кажется, заметили. Однако в директиве RewriteRule нет флага L (oe END), поэтому обработка будет продолжена, и может быть более поздняя директива вызывает перенаправление? (Хотя внешние перенаправления действительно должны быть перед любыми внутренними перезаписи.)

Если у вас также есть .htaccess (или контейнер ), то эти директивы также обрабатываются позже и потенциально могут вызвать перенаправление. (?)

Это правило также можно "упростить" - нет необходимости в обёртке , так как всё это можно сделать в одной директиве RewriteRule.

Например:

RewriteEngine On
RewriteRule ^/propostas/([^/]+)$ /subdir/propostas_usuarios/$1 [L]

Я поместил привязку к концу строки в регулярное выражение, иначе он будет соответствовать URL-адресу вида /propostas/billy.joe/anything. $1 — это обратная ссылка на первую захваченную группу (то есть имя пользователя) в шаблоне RewriteRule .

Как упоминалось выше, я включил флаг L, чтобы предотвратить дальнейшую обработку директив в текущем контексте. Однако директивы в контейнерах .htaccess) по-прежнему будут обрабатываться.

Если вы ранее видели внешнее перенаправление, вам необходимо убедиться, что кеш вашего браузера был очищен перед тестированием.

0
ответ дан 11 December 2020 в 21:46

Теги

Похожие вопросы