尾部斜杠“/”未添加到根URL

时间:2013-06-17 21:11:53

标签: django apache .htaccess apache-config

我最近遇到了一个我无法解决的奇怪问题。 我用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

另外为了使事情更清楚,当我把 r'^ new $'而不是 r'^''时,附加斜线正常工作正常 文件目录结构如下:

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

此处“其他文件”表示目录

的其他文件

更新1: orokusaki在upload-delete网址中指出了一个新错误,他更新了他的答案以便更正。只是指出这一点,因为它可能对其他人有帮助。

1 个答案:

答案 0 :(得分: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-delete(对于您希望以斜线结尾的任何其他视图,请执行相同操作)。 APPEND_SLASHES的工作方式在CommonMiddleware docs中比在设置文档中更好地记录。它的要点是:如果A)request.path与应用程序中的任何URL模式都不匹配,并且B)request.path + '/'确实与应用程序中的URL模式匹配,则Django将重定向到后者。 / p>

即使您手动手动输入upload-delete网址,/delete/123/网址也不会匹配/,因为额外的{{1}}与正则表达式不匹配。