如何将所有对domain.com / ...的请求重定向到 www .domain.com / ...并在django网站上使用301?
显然这不能在urls.py中完成,因为你只能在那里获得URL的路径部分。
我不能在.htaccess中使用mod重写,因为.htaccess文件在Django下没有任何作用(我认为)。
我猜中间件或apache conf中有什么东西?
我正在使用mod WSGI
在Plesk的Linux服务器上运行Django答案 0 :(得分:18)
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是留给读者的练习。 : - )
答案 1 :(得分:15)
PREPEND_WWW设置就是这样。
答案 2 :(得分:3)
a lightweight way to do that涉及VirtualHosts和mod_alias Redirect directive。您可以定义两个VirtualHost,一个持有重定向,另一个持有site configuration:
<VirtualHost *:80>
ServerName example.com
Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
# real site configuration
</VirtualHost>
这将完成这项工作。
答案 3 :(得分:0)
此处存在关于此问题的完整主题http://forum.webfaction.com/viewtopic.php?id=1516
答案 4 :(得分:0)
这也可以用中间件完成。
一些例子:
这是一个更好的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))
答案 5 :(得分:0)
我已经尝试过格雷厄姆的解决方案,但无法让它工作(即使最简单的情况是http(而不是https)没有任何路径。我对wsgi没有经验,因为你可以猜到并且所有帮助都是深刻的赞赏。
这是我的尝试(从www.olddomain.com重定向到www.newdomain.com)。当我尝试部署它时,尝试访问www.olddomain.com会导致错误(“无法访问此页面”):
from django.core.wsgi import get_wsgi_application
_application = get_wsgi_application()
def application(environ, start_response):
if environ['HTTP_HOST'][:21] == 'www.olddomain.com':
start_response('301 Redirect', [('Location', 'http://www.newdomain.com/'),])
return []
return _application(environ, start_response)
感谢您的帮助