Проблема: при доступе к нашему веб-сайту с недопустимым URL-адресом, который содержит знак «%», Nginx выдает ошибку 400 Bad Request.
Вместо страницы Nginx мы хотели бы переписать запрос на страницу (WordPress) 404.
Я пробовал следующее:
location @400 {
rewrite ^ /404 break;
}
error_page 400 =307 @400;
Тем не менее, это генерирует 500 внутренних ошибок сервера на Nginx.
В журнале ошибок Nginx говорится: «… пустой URI при перенаправлении в именованное местоположение« @ 400 »при чтении строки запроса клиента …, запрос:« GET <Неверная ссылка>«».
Это не является неожиданным, так как исходный URL недействителен.
Поэтому я думаю, что я ищу, чтобы установить URI явно для перезаписи. Как это сделать? Или есть лучший подход? Я не очень знаком с Nginx.
Согласно документация код должен быть немного другим.
Это переписывание скопировано из документации:
location /old/path.html {
error_page 404 =301 http:/example.com/new/path.html;
}
Вопрос в том, будет ли это работать так:
location 400 {
error_page 400 =307 http:/example.com/400.html;
}
… потому что на github-странице, на которую вы ссылаетесь, написано:
Если в конфигурации используется что-то вроде «error_page 400 @name»,
запрос может быть передан в именованное местоположение без установленного URI, и это
в свою очередь может привести к ошибкам сегментации или другим плохим последствиям, как
большая часть кода предполагает, что URI установлен.С этим изменением nginx поймает такие проблемы конфигурации в
ngx_http_named_location () и остановит обработку запроса, если URI
не установлено, возвращая 500.
Если это все еще текущее состояние, это будет означать, что ошибка 400 вызывает в nginx ошибку 500. Тем не менее я мог вызвать ошибку 400, а также доставить пользовательскую страницу 400 только с этой конфигурацией:
error_page 400 /400.html;
Таким образом, вы также можете попытаться настроить пользовательскую страницу ошибки 500, но я так и не запустил ее, вместо этого была показана только общая страница 500er для nginx.
Вы можете просто попробовать это с этой конфигурацией
error_page 400 /400.html;
error_page 404 /404.html;
error_page 500 /500.html;
Если это работает, вы можете настроить код 3xx и больше, как вы хотите.
Конечно, вы можете также доставить страницу с ошибкой 404 при ошибке 400, но мне так и не удалось переписать заголовки ошибок следующим образом:
error_page 404 =301 http:/example.com/new/path.html;
Других решений пока нет …