Я хочу преобразовать или замаскировать 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;
}
}
Вы переписываете в неправильном направлении: путь 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
не страдает от этой проблемы.