8

domain.com/...へのすべてのリクエストをdjangoサイトの301でwww.domain.com/ ...にリダイレクトするにはどうすればよいですか?

明らかに、これはurls.pyでは実行できません。URLのパス部分しか取得できないためです。

.htaccessファイルはDjangoでは何もしないので(私は思う)、.htaccessでmodrewriteを使用することはできません。

ミドルウェアやapacheconfで何かを推測していますか?

mod WSGIを使用して、Pleskを搭載したLinuxサーバーでDjangoを実行しています

4

4 に答える 4

18

誰かが指摘した WebFaction の議論は、構成に関しては正しいです。コントロール パネルではなく、自分で適用する必要があります。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

.htaccess ファイルに入れるか、適切なコンテキストでメインの Apache 構成に入れます。メインの Apache 構成の VirtualHost 内にある場合、ServerName を www.example.com に、ServerAlias を example.com にして、仮想ホストが両方の要求を確実に処理できるようにします。

Apache 構成にアクセスできない場合は、必要に応じて、Django WSGI アプリケーション エントリ ポイントの周りに WSGI ラッパーを使用して実行できます。何かのようなもの:

import django.core.handlers.wsgi
_application = django.core.handlers.wsgi.WSGIHandler()

def application(environ, start_response):
  if environ['HTTP_HOST'] != 'www.example.com':
    start_response('301 Redirect', [('Location', 'http://www.example.com/'),])
    return []
  return _application(environ, start_response)

サイト内に URL を含めるようにこれを修正し、https を処理することは、読者の課題として残されています。:-)

于 2010-02-18T03:05:50.117 に答える
15

PREPEND_WWW設定はまさにそれを行います。

于 2010-02-18T03:12:47.567 に答える
4

VirtualHostsと mod_alias Redirectディレクティブを使用してこれを行う軽量な方法があります。2 つの VirtualHosts を定義できます。1 つはリダイレクトを保持し、もう 1 つはサイト構成を保持します。

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # real site configuration
</VirtualHost>

そして、それは仕事をします。

于 2015-12-04T15:06:30.753 に答える
1

これもミドルウェアで実現できます。

いくつかの例:

これは snippet-510 のより良いバージョンです:

class UrlRedirectMiddleware(object):
    """
    This middleware lets you match a specific url and redirect the request to a
    new url. You keep a tuple of (regex pattern, redirect) tuples on your site
    settings, example:

    URL_REDIRECTS = (
        (r'(https?)://(www\.)?sample\.com/(.*)$', r'\1://example.com/\3'),
    )
    """
    def process_request(self, request):
        full_url = request.build_absolute_uri()
        for url_pattern, redirect in settings.URL_REDIRECTS:
            match = re.match(url_pattern, full_url)
            if match:
                return HttpResponsePermanentRedirect(match.expand(redirect))
于 2015-04-19T13:44:27.260 に答える