Django 1.3的URL重写

Django具有CommonMiddleware设置,默认情况下会向不以一个结尾的URL添加斜杠。

例如:(1)如果在URLconf中检测到/ admin /存在,则http://www.example.com/admin被重写为(2) http://www.example.com/admin/ 。

但是,我得到的情况,而不是(2),我得到(3) http://www.example.com//admin/这给我一个404错误。

这是正确的行为? 什么是解决404错误的一种方法? 非常感谢。

注意:我在Django 1.3 + nginx + gunicorn上运行。 我试着用Django 1.3 + nginx + apache + mod_wsgi运行,我也得到(3)(所以这不是一个Web服务器的问题),但我没有得到404错误。

================================================== ====================

更新:

问题出在nginxconfiguration上,我写这个configuration是为了将HTTP请求redirect到HTTPS。 以下是带有错误的nginxconfiguration示例:

upstream django { server 127.0.0.1:8000; } server { listen 80; server_name www.example.com; location / { rewrite (.*) https://www.example.com/$1 permanent; } } server { listen 443; server_name www.example.com; ssl on; ssl_certificate /home/user/certs/example.com.chained.crt; ssl_certificate_key /home/user/certs/example.com.key; ssl_prefer_server_ciphers on; ssl_session_timeout 5m; location ~ ^/static/(.*)$ { alias /home/user/deploy/static/$1; access_log off; expires max; } location / { try_files $uri $uri/ @django_proxy; } location @django_proxy { proxy_pass http://django; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Protocol https; } } 

CommonMiddleware正在从https://www.example.com/adminredirect到http://www.example.com/admin/ 。 这又一次击中了nginx,并且按照configuration文件中指定的方式完成了URL重写https://www.example.com/ $ 1,其中$ 1是“/ admin /”。 这意味着最终的URL是https://www.example.com//admin/ 。

为了纠正这个问题,我把重写规则改为:

 server { listen 80; server_name www.example.com; location / { rewrite /(.*) https://www.example.com/$1 permanent; } } 

“这是正确的行为吗?” 不,这不对。 在Djangoing的4年里,我从来没有见过这个特殊的问题。

CommonMiddleware引起这种测试的一种方法是在settings.py文件中注释掉它,然后重新启动,然后看看是否得到相同的行为。 使用独立的开发服务器和粘贴print在有趣的地方,看看是谁弄坏它也是有益的。

检查你的网址。 你很可能已经定义了你的URL有点不正确。 如果你有

 (r'^admin', include(admin.site.urls)) 

而不是正确的

 (r'^admin/', include(admin.site.urls)), 

你会看到这种类型的404与中间件