Как исправить ошибку 404 после изменения nginx $ args и перенаправления на измененный URL в Wordpress - PullRequest
1 голос
/ 04 июля 2019

Справочная информация: Мы используем внешний сервис, который перенаправляет на страницу подтверждения на нашем веб-сайте 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;
    }
}

1 Ответ

0 голосов
/ 05 июля 2019

РЕШЕНИЕ:

Решение моей проблемы состояло в том, что я пропустил инструкцию, чтобы сказать 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;
    }
}
...