Nginx+FastCGI に Django サイトがあり、URL に特別な文字がある場合、Django によって解析されるビュー パラメータは引用符で囲まれていません。
例:
# python manage.py runfcgi port=8099 --settings=settings
browser url: http://127.0.0.1/Contact/%E6%9C%B1/
Django urlpattern: url(r'^(?i)Contact/(?P<q>.*)/$', 'qsearch'),
qsearch 関数によってキャッチされたパラメータ 'q' はu'%E6%9C%B1'です。ただし、引用符で囲まれていないため、 u'\u6731'であると予想されます。
runserver をデバッグに使用すると、同じプログラムが正常に動作して u'\u6731' を取得します。したがって、回避策を使用する必要があります:</p>
q = unicode(urllib.unquote(str(q)), 'u8')
Nginx 設定:
location / {
fastcgi_pass 127.0.0.1:8099;
include /home/fastcgi_django.conf;
}
fastcgi_django.conf:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
問題がNginxまたはDjangoまたはFastCGIインターフェイスにあることを知りません。誰かが助けてくれることを願っています。
チャーリー