我最近遇到了一个我无法解决的奇怪问题。 我用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网址中指出了一个新错误,他更新了他的答案以便更正。只是指出这一点,因为它可能对其他人有帮助。
答案 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}}与正则表达式不匹配。