Django没有正确重定向

时间:2013-08-31 18:37:32

标签: python django redirect nginx

我的django网站正在http://localhost:8000运行。我正在尝试将它们重定向回网站的根网址,但它无法正常工作。它一直试图将我重定向回http://localhost并删除端口。我做错了什么?

from django.shortcuts import redirect

class Register(View):

    def post(self, request):
        return redirect('/')

这是我的home/urls.py文件:

from home.views import (
    Index,
    Feed,
    Search,
    Profile,
    Register,
    Login,
)

urlpatterns = patterns(
    '',
    url(r'^$', Index.as_view()),
    url(r'^feed$', Feed.as_view()),
    url(r'^feed$', Feed.as_view()),
    url(r'^search$', Search.as_view()),
    url(r'^profile$', Profile.as_view()),
    url(r'^profile/(?P<id>\d+)/?(.+)$', Profile.as_view()),
    url(r'^register$', Register.as_view()),
    url(r'^login$', Login.as_view()),
    url(r'^login$', 'login', name='login'),
)

app/urls.py我有这个:

urlpatterns = patterns('',
    url(r'^favicon\.ico$', RedirectView.as_view(url="%simg/favicon.ico" % django.conf.settings.STATIC_URL)),
    url(r'^', include('home.urls')),
)

FWIW我在vm上使用vagrant并运行nginx。我有nginx监听端口:在vm中有80,我将本地端口8000转发到端口:vm上的端口,然后将其路由到端口:vm上的8000。我正在通过运行python -B manage.py runserver 8000

启动该网站

2 个答案:

答案 0 :(得分:2)

我在这里看到一些问题。

  1. 你不应该将8000转发给任何东西。你应该让nginx监听端口80,然后添加一个指向127.0.0.1:8000的上游服务器并在该端口上启动runserver。完成后,您的网址应该都没有端口。如果希望链接起作用,请将端口80从vagrantfile转发到主机。或者你可以通过从你的设置中删除nginx来避免所有这些不愉快。

  2. 网址格式与查询字符串不匹配url(r'^profile/(?P<id>\d+)/?(.+)$', Profile.as_view()),不会将第二个匹配作为参数传递。你也有重复的模式。

  3. 最后,考虑命名您的观点。进入是一个好习惯。它还有助于重定向。

答案 1 :(得分:1)

Location:-redirects使用传入的Host: - 标头中的主机名/端口。我认为您需要配置nginx:发送正确的Host: - 标头或修复Location: - 标头。

尝试这样的事情(来自http://wiki.nginx.org/LikeApachehttp://wiki.nginx.org/HttpProxyModule#proxy_redirect

server {
  listen myhost:80;
  server_name  myhost;
  location / {
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_pass http://myapp:8080;
    proxy_redirect http://myapp:8080/ http://myhost/;
  }
}