1

私はこの問題をグーグルで検索しましたが、何も思いつきませんでした。

目標
リバース プロキシを (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 がどこかで失敗しているかどうかを確認するためにエラー ログを調べてみましたが、何も表示されませんが、ロギングに関する具体的な提案は受け付けています。ロギングを正しく設定しています。

申し訳ありませんが、これは非常に長く、できるだけ具体的にしようとしています。前もって感謝します!

4

1 に答える 1

0

私は問題を理解しました。これを機能させるには、ヘッダーの Content-Type に文字セットを明示的に渡す必要がありました。これは、以下を追加することによって達成されました。

AddDefaultCharset utf-8

私のApache設定ファイルに。これにより、header("Content-Type:") または header("Content-Type:text/html;charset=utf-8") をそれぞれに追加することなく、header("Location:...") へのすべての呼び出しがグローバルに修正されました。それらの中の一つ。

つまり、mod_proxy_html の ProxyHTMLLinks により、a) content-type が text/html (したがって ProxyHTMLLinks) である場合、302 Found がリバース プロキシ サーバーからクライアントに転送されなくなります。b) charsetが設定されておらず、c) ページに返されたコンテンツがありません。

私の意見では、これは通常のシナリオです。フォーム入力を処理するページは、多くの場合、3 つの基準すべてを満たしています。

何らかの理由でこれが意図された機能であり、何か間違ったことをしている可能性がありますが、それがどうなるかわかりません。少なくとも、誰かが役に立つと思った場合に備えて、ここにはエレガントなワークアウトがあります.

于 2013-02-27T17:40:12.293 に答える