私はこの問題をグーグルで検索しましたが、何も思いつきませんでした。
目標
リバース プロキシを (Apache の mod_proxy を使用して) 構成し、mod_proxy_html を使用してインターネット経由で内部 PHP アプリケーションにアクセスできるようにし、アプリケーションの URL を書き換えます。
問題の説明
次のコードのみを含む land.php を検討してください。
<a href="redirect.php">redirect.php</a>
および redirect.php のみ:
<?php
header("Location:http://internal.example.com/landing.php");
?>
私のhttpd.confからのこのスニペットで
UseCanonicalName On
LoadFile /usr/lib64/libxml2.so
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule xml2enc_module modules/mod_xml2enc.so
<VirtualHost *:80>
ServerName example.com
<Proxy *>
Order deny,allow
Allow from all
AllowOverride None
</Proxy>
ProxyPass / http://internal.example.com/
ProxyPassReverse / http://internal.example.com/
ProxyHTMLLinks a href #Commenting out this line fixes the problem, but I need it for rewriting
ProxyHTMLEnable On
RequestHeader unset Accept-Encoding
</VirtualHost>
http://example.com/landing.phpにアクセスして「redirect.php」をクリックすると、landing.php ページに戻るはずです。代わりに、Firefox では「この接続はリセットされました」、Chrome では「データが受信されませんでした」というメッセージが表示されます。(参考までに、http://internal.example.com/redirect.php にアクセスすると正しくリダイレクトされます。)
質問:
リダイレクトがリバース プロキシ経由で失敗する理由と、これを修正するにはどうすればよいですか?
ヒント
役立つ可能性のあるいくつかのことを発見しました...
「ProxyHTMLLinks a href」をコメントアウトすると、これが正しく機能することがわかっています。しかし明らかに、これは私が必要とする書き換え機能です。
また、redirect.php ページを次のように変更することもできます。これは正しく機能します。
<?php
header("Location:http://internal.example.com/landing.php");
?>
random text
このテキストは、何らかの形でページまたは HTTP ヘッダーに何らかの影響を与え、mod_proxy_html (より具体的には ProxyHTMLLinks) がそれがない場合とは異なる動作をするようになると思います。
また、redirect.php ページを次のように変更して、動作させることもできます。
<?php
header("Location:http://internal.example.com/landing.php");
header("Content-Type:");
?>
これが機能するのは、ProxyHTMLLinks がデフォルトで Content-Type text/html ファイルにのみ適用されるためです。ただし、これを機能させるために header("Location:...") へのすべての呼び出しをハックする必要はありません。header("Location:...") へのすべての呼び出しを変更してもかまいません。変更する内容がハックを作成するのではなく、問題を修正することであると仮定します。
最後に、リバース プロキシ サーバーでパケット スニッフィングを行ったところ、ヘッダー ("Location:...") が HTTP/1.1 302 Not Found をリバース プロキシ サーバーに送信することがわかりましたが、これは通過しません。 redirect.php を要求しているブラウザーに。上記の「解決策」のいずれかを試すと、302 がリバース プロキシ サーバーから redirect.php を要求しているコンピューターに渡されます。私の理解では、 Location ヘッダーはブラウザーに送られ、ブラウザーは返された新しい場所を要求する必要があります。302がブラウザに到達しないため、失敗しています...
参考までに、mod_proxy_html がどこかで失敗しているかどうかを確認するためにエラー ログを調べてみましたが、何も表示されませんが、ロギングに関する具体的な提案は受け付けています。ロギングを正しく設定しています。
申し訳ありませんが、これは非常に長く、できるだけ具体的にしようとしています。前もって感謝します!