Apache - ユーザーのブラウザの URL を変更せずにリダイレクトする

Apache - ユーザーのブラウザの URL を変更せずにリダイレクトする

ユーザーのブラウザの URL を変更せずに mod_rewrite を使用してリダイレクトする方法はありますか?

[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>、これらのディレクティブも後で処理され、リダイレクトがトリガーされる可能性があります。(?)

このルールは「簡略化」することもできます。すべてを 1 つのディレクティブ<LocationMatch>で実行できるため、ラッパーは必要ありません。RewriteRule

例えば:

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

正規表現に文字列の終わりのアンカーを入れました。そうしないと、形式のURLに一致します/propostas/billy.joe/anything。は、$1最初にキャプチャされたグループ(つまり、ユーザー名) の中にRewriteRule パターン

L上で述べたように、現在のコンテキストでそれ以上のディレクティブが処理されないようにフラグを含めました。ただし、<Directory>コンテナ (および.htaccess) 内のディレクティブは引き続き処理されます。

以前に外部リダイレクトが表示されていた場合は、テストする前にブラウザのキャッシュがクリアされていることを確認する必要があります。

関連情報