Маска nginx или преобразование строки запроса в другой URL

Я хочу преобразовать или замаскировать URL-адрес со строкой запроса на другой URL-адрес.

Откуда: https://www.example.com/world/web/?q=hello

Кому: https://www.example.com/world/web/search/hello

Я перепробовал все в Google, в том числе и этот код:

location ~ /world/web {
    if ($args ~* "^q=(.*)") {
        set $myparam $1;
        set $args '';
        rewrite ^.*$ /world/web/search/$myparam permanent;
    }
}

Отображается новый URL, но я получаю сообщение об ошибке 404 Not found . Я хочу отображать все из исходного URL ( https://www.example.com/world/web/?q=hello ), но я хочу, чтобы клиентский браузер видел другой URL ( https://www.example.com/world/web/search/hello )

Я использую fastcgi php.

Как я могу добиться этого? Я уверен, что чего-то не хватает.

Изменить: Вот мой полный серверный блок

server {
    listen       443 ssl http2;
    listen       [::]:443 http2;
    server_name  example.com;

   root /public/content/directory;

   location / {
     try_files $uri $uri/ /index.php?$args;
   }

   location /world/web/search {
    rewrite ^/world/web/search/(.*)$ /world/web/index.php?q=$1 last;
   }

   location = /world/web/index.php {
     if ($request_uri !~ /world/web/search) {
        return 301 /world/web/search/$arg_q;
     }
     fastcgi_pass unix:/var/opt/remi/php73/run/php-fpm/php-fpm.sock;
     fastcgi_index index.php;
     include /etc/nginx/fastcgi_params;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   }

    location ~ \.php$ {
        try_files $uri = 404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/opt/remi/php73/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
     }
}
0
задан 12 April 2020 в 05:56
1 ответ

Вы переписываете в неправильном направлении: путь URI /world/web/search/hello, отправленный браузером, должен быть внутренне переписан в /world/ web/index.php?q=hello и передается скрипту PHP.

Поэтому вам просто нужно:

location /world/web/search {
    rewrite ^/world/web/search/(.*)$ /world/web/index.php?q=$1 last;
}

Изменить: Как вы указали в комментарии, вы также хотите запретить браузерам использовать /world/web/ и /world/ web/index.php Пути URI напрямую.В таком случае вам по-прежнему нужна директива rewrite, как указано выше (что является причиной ваших 404 ошибок, поскольку файл с именем /world/ web/search не существует), и вам нужно добавить что-то вроде этого:

location = /world/web/index.php {
    if ($request_uri !~ /world/web/search) {
        return 301 /world/web/search/$arg_q;
    }
    # Your PHP config, e.g.:
    # include snippets/fastcgi-php.conf;
    # fastcgi_pass unix:/run/php/php7.3-fpm.sock;
}

Основной риск в этой конфигурации — попасть в петлю перенаправления. Это произошло бы, если бы вы использовали:

rewrite ^/world/web/index.php$ /world/web/search/$arg_q permanent;

во втором местоположении, так как rewrite совпадает с переменной $uri, которая перезаписывается внутренними переадресациями. $request_uri не страдает от этой проблемы.

0
ответ дан 10 April 2020 в 20:30

Теги

Похожие вопросы