web-dev-qa-db-ja.com

Django / modwsgiセットアップでの壊れたURL書き換え

Djangoアプリをmodwsgiを使用してApacheで実行するようにセットアップしようとしています。次の仮想ホストを定義しました:

<VirtualHost *>
    ServerName www.domain.com
    ServerAlias domain.com

    WSGIScriptAlias / /home/domain/Apache/Django.wsgi

    <Directory /home/domain/Apache>
    Order deny,allow
    Allow from all

    Options -Indexes +FollowSymlinks
    RewriteEngine on
    RewriteCond %{HTTP_Host} ^domain.com$ [NC]
    RewriteRule ^(.*)$ http://www.domain.com/$1 [QSA,L,R=301]
    </Directory>
</VirtualHost>

最後の書き換えルールは、www.domain.comを正規のサイト名にするためのものです。しかし、何か問題があります。 > http://domain.com を参照すると、> http://www.domain.com/Django.wsgi/ にリダイレクトされます。 > http://www.domain.com へのブラウジングは問題なく機能します。

構成に何かが欠けていますか?ありがとう。

更新: RewriteRuleをに変更しました

RewriteRule ^Django.wsgi/(.*)$ domain.com/$1 [L,R=301]. 

この変更により、問題が修正されます。 /Django.wsgi/の部分がURLに含まれる理由について、誰かが詳しく説明していただければ幸いです。ありがとう!

4
user31196

一致した$ 1パターンにはすでに「/」が含まれているため、元の書き換えルールは混乱を招く可能性があり、ダブルスラッシュを作成しました。使用するとどうなりますか:

RewriteRule ^(.*)$ http://www.domain.com$1 [QSA,L,R=301]

余分なルールを削除しますか?


更新1

あなたは私が言ったことを誤解しました。私はあなたの回避策について話していませんでしたが、元のルールについて話していました。

何が間違っているのか、そしてどれが潜在的に問題を引き起こしているのかをより明確にするには、次を使用します。

RewriteEngine on
RewriteCond %{HTTP_Host} ^domain\.com$ [NC]
RewriteRule ^/(.*)$ http://www.domain.com/$1 [L,R=301]

サブパターンの外側に「/」を明示的にリストした方法に注意してください。そうすることによってのみ、「$ 1」の前に「/」を使用しても問題ありません。そうしないと、スラッシュが繰り返されます。

QSAを削除することもお勧めします。私がインターネットの他の場所で見た例もそれを使用していません。

最後に、「。」をエスケープする必要があります。一致するホスト名で、それ以外の場合は、リテラル「。」以外のものと技術的に一致する可能性があります。同じように。

だから、それを試してみてください。それでも問題が解決しない場合は、リライトモジュールのログを有効にして、何が起こっているかを確認する必要があります。問題を引き起こしている他の書き換えルールが構成に含まれている可能性があります。


更新2

うーん、ついにあなたの実際の問題は、ディレクトリディレクティブコンテナの外側ではなく内側に書き換えルールがあることに気づきました。

したがって、書き換えルールをDirectoryディレクティブではなく、VirtualHostのすぐ内側に移動します。

2

これは、WebサーバーがSCRIPT_NAMEを「Django.wsgi」に設定しているために発生しています。 FORCE_SCRIPT_NAME = ""をsettings.pyに追加すると、RewriteRuleなしで実行できるはずです。

http://docs.djangoproject.com/en/dev/ref/settings/#force-script-name

0
rodjek