Справочная информация:
Мы используем внешний сервис, который перенаправляет на страницу подтверждения на нашем веб-сайте Wordpress. Этот сервис отправляет определенные параметры через URL-строки, которые мы хотим удалить, поскольку они содержат личную информацию. К сожалению, сервис не настраивается в этом направлении (то есть он всегда будет отправлять полный набор параметров).
Цель:
В настоящее время я работаю над блоком местоположения nginx, который должен убрать определенные URL-параметры из запросов на определенную страницу и перенаправить на ту же страницу с «чистым» URL. До сих пор мне удалось избавиться от нежелательного параметра в URL, однако я борюсь с перезаписывающей частью блока местоположения. Кажется, я еще не понял, как правильно переписать URL в контексте Wordpress.
Описание ошибки:
При доступе к нужному URL с параметром ?full_name=john
, nginx правильно удаляет параметр и пытается перенаправить на страницу. Однако nginx выдает ошибку 404.
Окружающая среда:
- Plesk Onyx 17.8 в Ubuntu 16.04
- Wordpress 5.2.2
- nginx: Plesk's
sw-nginx
- PHP: 7.3.6 (FPM через nginx)
Код:
Я использовал комментарий Siwei Shen о Удалите параметры в nginx rewrite , чтобы начать.
Вот что у меня есть:
location ^~ /confirmation/ {
if ($request_uri ~ "([^\?]*)\?(.*)full_name=([^&]*)&?(.*)") {
set $original_path $1;
set $args1 $2;
set $unwanted $3;
set $args2 $4;
set $args "";
rewrite ^(.+)$ /index.php/$original_path?$args1$args2 permanent;
}
}
Я считаю, что виновником является rewrite ^(.+)$ /index.php/$original_path?$args1$args2 permanent;
, так как я не совсем уверен, как переписать этот WordPress-friendly.
Я был бы очень признателен за любую помощь или указатели в правильном направлении. Большое спасибо заранее!
ОБНОВЛЕНИЕ 2019-07-05 :
Я изменил код благодаря @RichardSmith:
location ^~ /confirmation/ {
if ($request_uri ~ "([^\?]*)\?(.*)full_name=([^&]*)&?(.*)") {
set $original_path $1;
set $args1 $2;
set $unwanted $3;
set $args2 $4;
set $args "";
rewrite ^(.+)$ $original_path?$args1$args2 permanent;
}
}
Это вызывает ошибку 404 (взято из proxy_error_log
):
2019/07/05 11:51:13 [error] 22623#0: *39709 "/var/www/vhosts/domain.de/sub.domain.de/confirmation/index.html" is not found (2: No such file or directory), client: 109.41.XXX.XXX, server: sub.domain.de, request: "GET /confirmation/ HTTP/2.0", host: "sub.domain.de"
Это похоже на предполагаемое поведение, так как в этом месте нет index.html
. Однако теперь я должен сказать nginx не добавлять index.html
в переписанный запрос.
У вас есть идея, как это сделать?
Заранее спасибо!
РЕШЕНИЕ:
Решение моей проблемы состояло в том, что я пропустил инструкцию, чтобы сказать nginx, как работать, когда не найден файл. Поэтому nginx искал index.html в этом месте и не смог его найти. Добавление дополнительного блока if () после перезаписи URL, который обрабатывает доступ к местоположению без файла, сделал свое дело.
Код:
location ^~ /confirmation/ {
if ($request_uri ~ "([^\?]*)\?(.*)full_name=([^&]*)&?(.*)") {
set $original_path $1;
set $args1 $2;
set $unwanted $3;
set $args2 $4;
set $args "";
rewrite ^(.+)$ $original_path?$args1$args2 permanent;
}
if (!-e $request_filename) {
rewrite / /index.php last;
}
}