Django hat CommonMiddleware eingerichtet, die standardmäßig einen Schrägstrich an URLs anhängt, die nicht mit einem Schrägstrich enden.
Zum Beispiel: (1) http://www.example.com/admin wird umgeschrieben zu (2) http://www.example.com/admin/ wenn es in der URLconf feststellt, dass /admin/ existiert.
Allerdings erhalte ich anstelle von (2) (3) http://www.example.com//admin/ was zu einer 404-Fehlermeldung führt.
Ist dieses Verhalten korrekt? Was wäre eine Möglichkeit, den 404-Fehler zu beheben? Ich danke Ihnen vielmals.
Anmerkung: Ich bin auf Django 1.3 + nginx + gunicorn ausgeführt. Ich habe versucht, mit Django 1.3 + nginx + apache + mod_wsgi laufen und ich bin immer (3) als gut (so es ist nicht ein Webserver-Problem), aber ich bekomme nicht die 404-Fehler.
\======================================================================
UPDATE:
Das Problem liegt in der nginx-Konfiguration, die ich geschrieben habe, um HTTP-Anfragen auf HTTPS umzuleiten. Im Folgenden finden Sie ein Beispiel der nginx-Konfiguration mit dem Fehler:
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;
}
}
Das Problem war, dass die CommonMiddleware eine Umleitung von https://www.example.com/admin a http ://www.example.com/admin/. Daraufhin wurde nginx erneut angesprochen, und die URL wurde wie in der Konfigurationsdatei angegeben umgeschrieben auf https://www.example.com/ $1, wobei $1 "/admin/" ist. Dies bedeutete, dass die endgültige URL wie folgt lautete https://www.example.com//admin/ .
Um dies zu korrigieren, änderte ich die Rewrite-Regel in:
server {
listen 80;
server_name www.example.com;
location / {
rewrite /(.*) https://www.example.com/$1 permanent;
}
}