我想将带有查询字符串的 URL 转换或屏蔽为另一个 URL。
从: https://www.example.com/world/web/?q=hello
到: https://www.example.com/world/web/search/hello
我已经尝试了谷歌上的所有方法,包括这个代码:
location ~ /world/web {
if ($args ~* "^q=(.*)") {
set $myparam $1;
set $args '';
rewrite ^.*$ /world/web/search/$myparam permanent;
}
}
它显示了新的 URL,但我收到 404 未找到错误。我想显示原始 URL 中的所有内容(https://www.example.com/world/web/?q=hello )但我希望客户端浏览器看到不同的网址(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;
}
}
答案1
您重写的方向是错误的:/world/web/search/hello
浏览器发送的 URI 路径必须在内部重写/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;
在第二个中location
,由于rewrite
与变量匹配$uri
,该变量由内部重定向重写。$request_uri
不会受到此问题的影响。