【问题标题】:django inner redirectsdjango 内部重定向
【发布时间】:2010-06-09 11:25:36
【问题描述】:

我有一个项目,在我自己的开发计算机上(使用 mod_wsgi 服务项目)没有引起任何问题。在实时服务器(使用 mod_fastcgi)中,它生成 500。

我的 url conf 是这样的:

# -*- coding: utf-8 -*-
from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
      url(r'^admin/', include(admin.site.urls)),
      url(r'^', include('jalka.game.urls')),
)

# -*- coding: utf-8 -*-
from django.conf.urls.defaults import *

from django.contrib.auth import views as auth_views

urlpatterns = patterns('jalka.game.views',
      url(r'^$',
            view = 'front',
            name = 'front',),
      url(r'^ennusta/(?P<game_id>\d+)/$',
            view = 'ennusta',
            name = 'ennusta',),
      url(r'^login/$',
            auth_views.login,
            {'template_name': 'game/login.html'},
            name='auth_login'),
      url(r'^logout/$',
            auth_views.logout,
            {'template_name': 'game/logout.html'},
            name='auth_logout'),
      url(r'^arvuta/$',
            view = 'arvuta',
            name = 'arvuta',),            
)

而 .htaccess 就是这样:

Options +FollowSymLinks 
RewriteEngine on
RewriteOptions MaxRedirects=10
# RewriteCond %{HTTP_HOST} . 
RewriteCond %{HTTP_HOST} ^www\.domain\.com
RewriteRule (.*) http://domain.com/$1 [R=301,L]

AddHandler fastcgi-script .fcgi

RewriteCond %{HTTP_HOST} ^jalka\.domain\.com$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) cgi-bin/fifa2010.fcgi/$1 [QSA,L]

RewriteCond %{HTTP_HOST} ^subdomain\.otherdomain\.eu$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) cgi-bin/django.fcgi/$1 [QSA,L]

请注意,我还使用相同的 .htaccess 设置了其他项目,并且使用更复杂的 url 和视图运行得很好

fifa2010.fcgi:

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import sys, os

DOMAIN = "domain.com"
APPNAME = "jalka"

PREFIX = "/www/apache/domains/www.%s" % (DOMAIN,)

# Add a custom Python path.
sys.path.insert(0, os.path.join(PREFIX, "htdocs/django/Django-1.2.1"))
sys.path.insert(0, os.path.join(PREFIX, "htdocs"))
sys.path.insert(0, os.path.join(PREFIX, "htdocs/jalka"))


# Switch to the directory of your project. (Optional.)
os.chdir(os.path.join(PREFIX, "htdocs", APPNAME))

# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "%s.settings" % (APPNAME,)

from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")

艾伦

编辑:我增加了最大重定向并得到了不同类型的错误:[Wed Jun 9 15:11:46 2010] [error] [client 84.50.104.242] (63)File name too long: access to /www/apache /domains/www.domain.com/htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apache/domains/www.domain.com/htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apache/domains /www.domain.com/htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apache/domains/www.domain.com/htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apache/domains/www .domain.com/htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apache/domains/www.domain.com/htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apache/domains/www.domain .com/htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apache/domains/www.domain.com/htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apache/domains/www.domain.com /htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apache/domains/www.domain.com/htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apache/domains/www.domain.com/htdocs /cgi-bin/fifa2010.fcgi/jalka/www/apache/domains/www.domain.com/htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apach e/domains/www.domain.com/htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apache/domains/www.domain.com/htdocs/cgi-bin/fifa2010.fcgi/jalka/www/apache/域/www.domain.com/htdocs/cgi-bin/fifa2010.fcgi/jalka/ 失败

看起来它一直在重定向回自己,但至于为什么 - 我不知道。

Edit2- 已解决! 最后,当我将 .htaccess 更改为此它开始工作时:

RewriteCond %{HTTP_HOST} ^jalka\.domain\.com$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) /cgi-bin/fifa2010.fcgi [QSA,L]

RewriteCond %{HTTP_HOST} ^subdomain\.otherdomain\.eu$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) cgi-bin/django.fcgi/$1 [QSA,L]

【问题讨论】:

    标签: django mod-rewrite


    【解决方案1】:

    这似乎是你的问题:

    RewriteCond %{HTTP_HOST} ^jalka\.domain\.com$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*) cgi-bin/fifa2010.fcgi/$1 [QSA,L]
    

    让我们举一个对http://jalka.domain.com/jalka.html 的请求示例,如果 jalka.html 不存在,您的代码会将您重定向到http://jalka.domain.com/cgi-bin/fifa2010.fcgi/jalka.html。当 Apache 查找 /cgi-bin/fifa2010.fcgi/jalka.html 时它不会找到它,因为 fifa2010.fcgi 是一个文件,而不是一个目录。结果,您将被重定向到http://jalka.domain.com/cgi-bin/fifa2010.fcgi/cgi-bin/fifa2010.fcgi/jalka.html。再次,找不到该文件。

    这就是导致文件名过长错误的原因,因为这种重定向会一遍又一遍地发生。

    【讨论】:

    • 谢谢!你对我发现自己的发现提出了几乎准确的描述——顺便说一句,我解决了。我不知道究竟是为什么,但是.fcgi 文件的这两个重写似乎工作方式不同,因为其中一个是用于子域的,它的域本质上是 domain.com 的域别名。当我尝试将其设置为与 domain.com 的子域完全一样时,它通过添加子域(jalka)作为请求路径的一部分来实现不同的工作方式。在解决这个问题的过程中,我得到了 domain.com/cgi-bin/fifa2010.fcgi/jalka/ 之类的路径 - 这些生成的 django 错误,但至少我知道我正在关闭
    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多