在https端口(443)上运行Django。当用户访问https://hostname/newAPP时,我希望Django重定向到https://hostname:port。
我在urls.py中的urlpatterns中尝试了以下行,但无法获得结果。
url(r'^newAPP$', RedirectView.as_view(url=':8000', permanent=True), name='NewApp')
实际上它正在被重定向,但是被错误地形成了网址“https:hostname /:8000”。请注意,“:”位于“ / ”之后。
服务器有多个IP /主机名,因此硬编码IP /主机名不是一种选择。
答案 0 :(得分:1)
在基本urls.py
文件中,您可以添加以下内容以创建一个视图,该视图重定向到同一IP上的其他端口。
我尚未对该代码进行广泛的测试,但现在它对我有效。如果有人想到将其可靠地重定向到其他端口,我将不胜感激。
from django.shortcuts import redirect
def get_new_url(request):
# Specify the port number, you could get this dynamically
# through a config file or something if you wish
new_port = '5000'
# `request.get_host()` gives us {hostname}:{port}
# we split this by colon to just obtain the hostname
hostname = request.get_host().split(':')[0]
# Construct the new url to redirect to
url = 'http://' + hostname + ':' + new_port + '/'
return redirect(url)
urlpatterns = [
# Some other paths
path('something/', views.some_view, name='something')
# ...
# ...
# Add your redirect
path('newAPP/', get_new_url, name='newapp'),
]
如果需要,函数get_new_url()
可以位于views.py文件中。只需确保将其导入,然后再在urlconf
中引用它即可。
答案 1 :(得分:0)
嗯,您的示例无法正常工作,因为您在localhost:2000 /之后重定向,您可以使用以下内容创建一个视图以重定向到另一个域:
在urls.py中:
url(r'^newAPP', views.redirect, {'var': 2000}),
url(r'^anotherAPP', views.redirect, {'var': 3000}), #Of course you can use this view for more than one app
并在您的观点中:
def redirect(request, **kwargs):
return HttpResponseRedirect('https://localhost:%s' % kwargs.get('var'))
如果你不喜欢这种方式,你可以使用服务器。下一个例子是nginx:
server {
. . .
server_name example.com www.example.com;
rewrite ^/newAPP$ https://localhost:2000 permanent;
rewrite ^/anotherAPP$ https://localhost:3000 permanent;
. . .
}
有关nginx redirects的更多信息。告诉我,如果这有助于你