9

私は WSGI アプリ (Django プロジェクト) を gunicorn で実行しており、mod_proxy で Apache を使用して からに127.0.0.1:18731リクエストをリダイレクトしています。静的ファイルは の外部に保存されます。Django アプリが何もリダイレクトする必要がない場合、これは問題なく機能しますが、リクエストをリダイレクトしようとすると (たとえば、末尾のスラッシュを に追加する)、最終的に URL から削除され、無効な URL が残ります。http://example.com/my-project/*http://127.0.0.1:18731/*/my-project/http://example.com/my-project/foo/my-project/http://example.com/foo/

私の mod_proxy 構成は次のとおりです。

<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>
ProxyRequests On
ProxyPass /my-project/ http://127.0.0.1:18731/ retry=0
ProxyPassReverse /my-project/ http://127.0.0.1:18731/ retry=0
ProxyPreserveHost On
ProxyErrorOverride Off

/my-project/移植性のために、Django がすべての URL にプレフィックスを付けることを強制したくありません。Apache はどうやらこの行で独自にプレフィックスを処理しているはずProxyPassReverseです。私は何を間違っていますか?

4

3 に答える 3

7

私はこの問題を抱えていました。

ProxyPreserveHost On

<Location "/my-project/">
    ProxyPass http://127.0.0.1:18173/my-project/
    ProxyPassReverse http://127.0.0.1:18173/my-project/
    RequestHeader set SCRIPT_NAME /my-project
    RequestHeader set X-FORWARDED-PROTOCOL ssl
    RequestHeader set X-FORWARDED-SSL on
</Location>

WSGI アプリが絶対 URL を作成できるようにするには、次のものが必要です。

  • ProxyPreserveHost OnHost:ヘッダーが渡され、アプリはクライアントが私たちを見るホスト名を認識します。
  • ヘッダーを追加しSCRIPT_NAMEて、アプリがルートの場所を認識できるようにします。
  • X-FORWARDED-必要に応じてヘッダーを設定します。私もsslを使用しているので、アプリにhttpsスキームを使用するように指示する必要があります。

<Location>この仮想ホストでさらに多くのことを行うため、ディレクティブを使用します。pathしかし、引数をProxyPassandProxyPassReverseディレクティブに渡すことで、これを簡単に書き直すことができます。

注意:フォワード プロキシも必要でない限り、OffProxyRequestsにする必要があります。これを読んでいるのであれば、おそらくリバース プロキシだけが必要でしょう。

Django 固有の注意:settings.LOGIN_URLはそのまま使用されるため、自分で を先頭に追加する必要がありSCRIPT_NAMEます。

于 2011-10-20T12:47:31.830 に答える
2

これを試しましたか?あなたもプロキシしているURLにmy-projectを追加しました。

<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>
ProxyRequests On
ProxyPass /my-project/ http://127.0.0.1:18731/my-project/ retry=0
ProxyPassReverse /my-project/ http://127.0.0.1:18731/my-project/ retry=0
ProxyPreserveHost On
ProxyErrorOverride Off

私は通常、この種のものにnginxを使用しているため、それが機能するかどうかはわかりません。

更新:上記はうまくいかなかったので、別のことを試してください。

このようなことを試して、それが役立つかどうかを確認してください。少し変わった設定になっています。エイリアス経由で提供されるメディアを除くすべてをプロキシします。これにより、 /my-project/ を持つ必要がまったくなくなります。

<VirtualHost *:80>
ServerName example.com
UseCanonicalName On
ServerAdmin webmaster@localhost

LogLevel warn
CustomLog /var/log/apache2/example.com/access.log combined
ErrorLog /var/log/apache2/example.com/error.log
ServerSignature On

Alias /media/ /home/example/example.com/pysrc/project/media/

ProxyPass /media/ !
ProxyPass / http://127.0.0.1:18731/
ProxyPassReverse / http://127.0.0.1:18731/
ProxyPreserveHost On
ProxyErrorOverride Off
</VirtualHost>
于 2011-06-21T00:39:32.157 に答える
0

ProxyPassReverse構成を実際のドメイン名に設定することで、元の問題を解決しました。

ProxyPass /my-project/ http://127.0.0.1:18731/
ProxyPassReverse /my-project/ http://mydomain.com/

ヒント:ApacheProxyPassReverse値

于 2013-03-21T18:03:10.610 に答える