2011-06-28 64 views
3

Django具有CommonMiddleware設置,默認情況下會向不以一個結尾的URL添加斜槓。Django 1.3 URL重寫

例如: (1)如果在URLconf中檢測到/ admin /存在,則將http://www.example.com/admin重寫爲(2)http://www.example.com/admin/。 (3)http://www.example.com//admin/這給我一個404錯誤。但是,我得到的情況,而不是(2),我得到(3)http://www.example.com//admin/這給我一個404錯誤。

這是正確的行爲?什麼是解決404錯誤的一種方法? 非常感謝。

注: 我在Django 1.3 + nginx + gunicorn上運行。 我試過用Django 1.3 + nginx + apache + mod_wsgi運行,我也得到(3)(所以它不是一個web服務器問題),但我沒有得到404錯誤。

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

UPDATE:

問題是與nginx的配置,這是我寫的HTTP請求重定向到HTTPS。 以下是有錯誤的nginx的配置的一個示例:

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/adminHTTP重定向://www.example.com/admin/。這再次擊中了nginx,並按照配置文件中的指定完成了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; 
    } 
} 

回答

3

不,這不對。在Djangoing的4年中,我從未見過這個特殊的問題。

CommonMiddleware導致此問題的一種測試方法是在您的settings.py文件中將其註釋掉,然後重新啓動,然後查看是否得到相同的行爲。使用獨立的開發服務器並將print放在有趣的地方查看誰在修改它也是有益的。

+0

您好感謝您的答覆。我忽略了提到我正在運行nginx作爲SSL反向代理。我用沒有nginx的dev服務器運行了一個Django的vanilla實例,問題不會發生。望着它... – quekshuy

+0

請回報你找到的東西。我在幾個網站上使用nginx,並且總是很好地知道要注意的怪異點。 –

+0

這是我的錯誤。感謝您試圖將我指向正確的方向。我會接受你的回答。 – quekshuy

0

檢查您的URL。您很可能已經錯誤地定義了您的網址。如果你有

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

而不是正確的

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

你會看到這種類型的404與中間件

+0

嗨,感謝您的回覆。我已經檢查過這個。這是正確的版本。 – quekshuy