Cathy's aswer のコメントの形式で既に投稿されているように、これは非常に優れていますが、この特定のケースでは機能しません。現在の少しハックなソリューションを別の回答としてここに公開します。
どうやら、このエラーは Django のミドルウェア内ではオーバーライドできません。これは、\django\core\handlers\wsgi.py の WSGIHandler 内でトリガーされる UNICODE デコード エラーです。正確には、
path_info = force_unicode(environ.get('PATH_INFO', u'/'))
問題を引き起こしているWSGIRequest内。これは基本的に Django の正しい動作ですが、私の質問で説明したように、空のエラー ページよりも便利なものをユーザーに表示したいだけです。したがって、受信 URL リクエストを有効な UNICODE 文字でチェックしてから、WSGIHandler に渡します。このブログ投稿は正しい方向を示してくれました: http://codeinthehole.com/writing/django-nginx-wsgi-and-encoded-slashes/
したがって、次のように wsgi.py 内の無効な URL を再ルーティングします。
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
_application = django.core.handlers.wsgi.WSGIHandler()
# for Django 1.7+
# from django.core.wsgi import get_wsgi_application
# _application = get_wsgi_application()
from django.utils.encoding import force_unicode
def application(environ, start_response):
try:
path_info = force_unicode(environ.get('PATH_INFO', u'/'))
except:
environ['PATH_INFO'] = u'/'
return _application(environ, start_response)
代わりに WSGHandler をサブクラス化しても機能するはずです。この例では、無効な URL をサイトのルート「/」にリダイレクトするだけです。ただし、任意のカスタム エラー ページ URL にリダイレクトすることも、URL のサニタイズを試みることもできます。