将http重定向到https以扭曲

问题描述:

我使用的是扭曲的django应用程序。我现在从http移动到https。如何在http中添加重定向到https?将http重定向到https以扭曲

+0

请详细说明您如何使用Twisted运行您的Django应用程序。 – MattH 2011-03-15 15:45:07

在Twisted Web中生成重定向的简单方法是使用Redirect资源。使用URL实例化它并将其放入资源层次结构中。如果它被渲染,它会返回一个重定向响应于网址:

from twisted.web.util import Redirect 
from twisted.web.resource import Resource 
from twisted.web.server import Site 
from twisted.internet import reactor 

root = Resource() 
root.putChild("foo", Redirect("https://stackoverflow.com/")) 

reactor.listenTCP(8080, Site(root)) 
reactor.run() 

这将运行它响应了http://localhost:8080/一个重定向至https://stackoverflow.com/请求的服务器。

如果你在主持的HTTPS服务器上的WSGI容器中运行的Django,那么你可能有一些代码看起来是这样的:

from twisted.internet import reactor 
from twisted.web.wsgi import WSGIResource 
from twisted.web.server import Site 
from django import some_wsgi_application_object # Not exactly 

root = WSGIResource(reactor, reactor.getThreadPool(), some_wsgi_application_object) 
reactor.listenSSL(8443, Site(root), contextFactory) 

reactor.run() 

您可以运行它产生的重定向额外的HTTP服务器,你只需添加一些代码从第一个例子,第二个例子想:

from twisted.internet import reactor 
from twisted.web.wsgi import WSGIResource 
from twisted.web.util import Redirect 
from twisted.web.server import Site 
from django import some_wsgi_application_object # Not exactly 

root = WSGIResource(reactor, reactor.getThreadPool(), some_wsgi_application_object) 
reactor.listenSSL(8443, Site(root), contextFactory) 

old = Redirect("https://localhost:8443/") 
reactor.listenTCP(8080, Site(old)) 

reactor.run() 
+0

正确,但对于HTTPS重定向,您希望不重定向到固定URL,而是重定向到URL a)用户输入的任何主机名或地址,以及b)用户输入的服务器上的相同路径。 (例如,我会在apache mod_rewrite中使用'RewriteRule^var/www-redirect /(.*)$ https://%{SERVER_NAME}/$ 1 [R,L]')来执行此操作。这是可能的重定向资源或其他方式扭曲? – rakslice 2011-05-19 04:05:28

+0

呃,我的mod_rewrite例子是用于文档根目录'/ var/www-redirect'的重定向站点。 =) – rakslice 2011-05-19 04:11:52

+1

当然。 'Redirect'实际上是一个非常简单的类,。它可以扩展为从请求中获取主机名,并在重定向中使用它。你也可以看一下'ChildRedirector'来看看如何保存请求路径。 – 2011-05-19 04:15:15

从任何给定的路径上HTTP重定向到同一路径上的HTTPS (基于让 - 保罗的建议响应我的评论):

from twisted.python import urlpath 
from twisted.web import resource, util 

class RedirectToScheme(resource.Resource): 
    """ 
    I redirect to the same path at a given URL scheme 
    @param newScheme: scheme to redirect to (e.g. https) 
    """ 

    isLeaf = 0 

    def __init__(self, newScheme): 
     resource.Resource.__init__(self) 
     self.newScheme = newScheme 

    def render(self, request): 
     newURLPath = request.URLPath() 
     if newURLPath.scheme != self.newScheme: 
      raise ValueError("Redirect loop: we're trying to redirect to the same URL scheme in the request") 
     newURLPath.scheme = self.newScheme 
     return util.redirectTo(newURLPath, request) 

    def getChild(self, name, request): 
     return self 

然后你可以使用RedirectToScheme("https"),代替你的Site()为您希望从重定向HTTP站点。

注意:如果您想要从其重定向的HTTP位于非标准端口上,那么URLRequest中可能还有一个:<port>部分,您还需要重写该部分。

+0

这用于工作,因为redirectTo用于取其第一个参数(此处为'newURLPath')并将其插入到具有'%s'的字符串中。然而,更新版本的Twisted已经改变为做其他事情。现在将一个'URLPath'传递给'redirectTo'是一个错误。这种感觉就像Twisted中的一种回归 - 但'redirectTo'被记录为在之前(现在是'bytes')采用'str'。所以......人们也可以说这是对API的错误使用。无论如何,为了实现这个目标,你应该在将'newURLPath'传递给'redirectTo'''bytes(newURLPath)'之前将它砸成一个字节字符串。 – 2016-11-21 14:38:03