Как установить Nginx URI для исправления пустого URI при перенаправлении в именованное местоположение

Проблема: при доступе к нашему веб-сайту с недопустимым 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.

3

Решение

Согласно документация код должен быть немного другим.

Это переписывание скопировано из документации:

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;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]