Django 实现前置WWW相反方向的最佳方法(例如,从“WWW”重定向到根域)?

Django 实现前置WWW相反方向的最佳方法(例如,从“WWW”重定向到根域)?,django,apache,nginx,Django,Apache,Nginx,Django的PREPEND_WWW加上Common中间件自动将所有根域流量重定向到“WWW.”域。我如何才能最好地实现相反的目标?在django手下?阿帕奇?Ngnix?在可能的情况下,您需要在django之外执行这种重定向。以下是和的说明。(您需要根据所需的非www或www性能调整配置。) 至于为什么要在django之外这样做,答案是性能。这里不需要让django处理请求和响应,因为它可以在请求生命周期的早期完成。这意味着您可以在实际需要时保存django进程 您应该使用WWWPREPEND

Django的PREPEND_WWW加上Common中间件自动将所有根域流量重定向到“WWW.”域。我如何才能最好地实现相反的目标?在django手下?阿帕奇?Ngnix?

在可能的情况下,您需要在django之外执行这种重定向。以下是和的说明。(您需要根据所需的
非www
www
性能调整配置。)

至于为什么要在django之外这样做,答案是性能。这里不需要让django处理请求和响应,因为它可以在请求生命周期的早期完成。这意味着您可以在实际需要时保存django进程


您应该使用WWWPREPEND_WWW或类似工具的唯一原因是您无法访问服务器配置(例如某些共享托管环境)。这是最后的手段。

在可能的情况下,您可能希望在django之外执行这种重定向。以下是和的说明。(您需要根据所需的
非www
www
性能调整配置。)

至于为什么要在django之外这样做,答案是性能。这里不需要让django处理请求和响应,因为它可以在请求生命周期的早期完成。这意味着您可以在实际需要时保存django进程


您应该使用WWWPREPEND_WWW或类似工具的唯一原因是您无法访问服务器配置(例如某些共享托管环境)。这是最后的手段。

作为@DanielB,在Django以外的地方这样做对性能更好

但是,如果您想在Django中进行测试(例如,您想学习,或者您不关心性能,或者您想测试您的测试服务器是否不使用Apache,或者其他什么),那么您可以使用我发现的以下代码:


作为@DanielB,在Django之外执行此操作对性能更有利

但是,如果您想在Django中进行测试(例如,您想学习,或者您不关心性能,或者您想测试您的测试服务器是否不使用Apache,或者其他什么),那么您可以使用我发现的以下代码:



你会想在django以外的地方做这件事。和的说明。完整答案:为什么在django之外?除了root->wwwww之外,还有www->root吗?这样可以省去打django的开销。你必须事先点击nginx/apache,他们可以提供请求,而不必让django处理请求/响应。
非www
->
www
的操作与
www
->
非www
相同,只需颠倒配置即可。我会在web服务器级别执行此操作,但你可以使用apache或nginx,你想要哪个答案?你需要在django以外的地方做这个。和的说明。完整答案:为什么在django之外?除了root->wwwww之外,还有www->root吗?这样可以省去打django的开销。你必须事先点击nginx/apache,他们可以提供请求,而不必让django处理请求/响应。
非www
->
www
的操作与
www
->
非www
相同,只需颠倒配置即可。我会在web服务器级别执行此操作,但你可以使用apache或nginx,你想要哪一个答案?直接从django来怎么样,如果有必要的话?(在我的情况下是这样的,因为站点的一部分必须使用www,而另一部分不能使用www)。在apache上使用mod_rewrite或nginx使用
location
指令仍然可以。为什么部分网站必须使用www?部分网站是传统内容,必须保留入站链接。站点的其余部分是崭新的,所选择的约定是根域。但我也在这里找到了所有选项的答案。假设链接在新网站上仍然有效,您可以使用给定的解决方案(这将产生永久移动的
301
)。如果旧内容在新站点上不可用,则需要考虑如何区分对新站点和旧站点的请求。代码>www-vs-
非www
可能不适用于此,因为这可能会让您的用户感到困惑。301移动会导致验证链接的用户产生一些混乱。如果可能的话,我希望旧内容在任一前缀上提供服务,而新内容在根目录下提供服务。但为了回答这个问题,只需列出选项就可以了。直接从django开始怎么样?是否有必要?(在我的情况下是这样的,因为站点的一部分必须使用www,而另一部分不能使用www)。在apache上使用mod_rewrite或nginx使用
location
指令仍然可以。为什么部分网站必须使用www?部分网站是传统内容,必须保留入站链接。站点的其余部分是崭新的,所选择的约定是根域。但我也在这里找到了所有选项的答案。假设链接在新网站上仍然有效,您可以使用给定的解决方案(这将产生永久移动的
301
)。如果旧内容在新站点上不可用,则需要考虑如何区分对新站点和旧站点的请求。代码>www-vs-
非www
可能不适用于此,因为这可能会让您的用户感到困惑。301移动会导致验证链接的用户产生一些混乱。如果可能的话,我希望旧内容在任一前缀上提供服务,而新内容在根目录下提供服务。但为了回答这个问题,只需列出选项就可以了。
class RemoveWwwMiddleware():
    def process_request( self, request ):
        try:
            if request.META['HTTP_HOST'].lower().find('www.') == 0:
                from django.http import HttpResponsePermanentRedirect
                return HttpResponsePermanentRedirect(request.build_absolute_uri().replace('//www.', '//'))
        except:
            pass