2

我最近遇到了一个非常奇怪的问题,我无法解决。我正在使用 mod_wsgi 和 apache 运行 django,问题是

www.example.com/subdir

没有被定向到

www.example.com/subdir/

urls.py 看起来像这样:

import os
from django.conf.urls.defaults import *
from fileupload.views import PictureCreateView, PictureDeleteView

urlpatterns = patterns('',
    (r'^$', PictureCreateView.as_view(), {}, 'upload-new'),
    (r'^delete/(?P<pk>\d+)$', PictureDeleteView.as_view(), {}, 'upload-delete'),
    (r'^fileupload/media/(.*)$', 'django.views.static.serve', 
    {'document_root':os.path.join(os.path.abspath(os.path.dirname(__file__)),'media')}),

)

对我来说,在末尾加上一个斜杠很重要。我尝试将 .htaccess 放在文件夹中,但它只适用于 firefox 而不是 google chrome。

你能建议一种用 django 做到这一点的方法吗,或者这是 apache 而不是 django 的问题

编辑 1: APPEND_SLASH 未设置为 false。

httpd.conf 也有这个:

<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName example.cm

WSGIScriptAlias /subdir /var/www/html/cloudcv/apache/django.wsgi
<Directory /var/www/html/cloudcv>
  Order allow,deny
  Allow from all
</Directory>
</VirtualHost>

settings.py 有这个:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

ROOT_URLCONF = 'fileupload.urls'
APPEND_SLASH = true

另外为了让事情更清楚,当我输入 like r'^new$'而不是r'^$' 并且文件目录结构如下时,附加斜杠工作正常:

- /var/www/html/cloudcv/
    + apache
    -fileupload
         urls.py
         views.py
         <other files>
    settings.py
    <other files>

这里的“其他文件”是指目录的其他文件

更新 1:orokusaki 在上传删除 url 中指出了一个新错误,他更新了他的答案以更正。只是指出这一点,因为它可能对其他获得此答案的人有所帮助。

4

1 回答 1

3

这实际上是现代浏览器试图美化 HTTP 的产物。如果您从 URL 栏中复制 URL(或查看 HTTP 标头),您可能会看到尾部斜杠确实存在。

更新

我看你的不够仔细urls.py。你只需要这样做:

urlpatterns = patterns('',
    (r'^$', PictureCreateView.as_view(), {}, 'upload-new'),
    (r'^delete/(?P<pk>\d+)/$', PictureDeleteView.as_view(), {}, 'upload-delete'),
    (r'^fileupload/media/(.*)$', 'django.views.static.serve', 
    {'document_root':os.path.join(os.path.abspath(os.path.dirname(__file__)),'media')}),

)

注意/添加到upload-deleteURL 中(对您希望以斜杠结尾的任何其他视图执行相同操作)。CommonMiddleware 文档中的工作方式比设置文档APPEND_SLASHES中更好地记录。它的要点是:如果 A)不匹配应用程序中的任何 URL 模式,并且 B)匹配应用程序中的 URL 模式,Django 将重定向到后者。request.pathrequest.path + '/'

即使您手动手动输入,您的upload-deleteURL 也不会匹配,因为额外的内容与正则表达式不匹配。/delete/123//

于 2013-06-18T01:35:57.810 回答