【问题标题】:trailing slash "/" not added to root url尾部斜杠“/”未添加到根 url
【发布时间】:2013-06-13 23:08:49
【问题描述】:

我最近遇到了一个非常奇怪的问题,我无法解决。 我正在使用 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 指出了上传删除 url 中的一个新错误,他更新了他的答案以更正。只是指出这一点,因为它可能对其他获得此答案的人有所帮助。

【问题讨论】:

  • 你能显示你的中间件设置吗? APPEND_SLASH 设置是否也设置为 False
  • 更新了问题。请看一下
  • 中间件设置?它需要CommonMiddleware 启用
  • 是的。它已启用。抱歉,我忘了在 settings.py 中添加它。默认情况下是这样,所以我认为这不是问题的解决方案。

标签: django apache .htaccess apache-config


【解决方案1】:

这实际上是现代浏览器试图美化 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 URL(对您希望以斜线结尾的任何其他视图执行相同操作)。 APPEND_SLASHES 的工作方式在 CommonMiddleware docs 中的记录比在设置文档中的记录更好。它的要点是:如果 A)request.path 不匹配应用程序中的任何 URL 模式,并且 B)request.path + '/' 确实匹配应用程序中的 URL 模式,Django 将重定向到后者。

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

【讨论】:

  • 嗯.. 对不起我的菜鸟,但我如何检查它是否存在于 HTTP 标头中。它仍然没有解决我的问题,我仍然需要找到一种将斜杠添加到 URL 的方法。然而,作为一种中间解决方案,我在页面加载时通过 Javascript 将尾部斜杠添加到 URL。
  • @HarshAgrawal - 抱歉,我忽略了您的 URL conf 中的错误 - 答案已更新。
  • 感谢您提供该信息。我实际上没有遇到那个错误,但我很高兴你指出了这一点。但是我认为它不能解决 (r'^$', PictureCreateView.as_view(), {}, 'upload-new') 的错误,因为此 url 中没有添加斜杠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2018-11-18
  • 2012-08-03
  • 2012-09-25
  • 2012-07-06
  • 2021-04-18
  • 2021-12-14
相关资源
最近更新 更多