nginx 掩码或将查询字符串转换为不同的 url

nginx 掩码或将查询字符串转换为不同的 url

我想将带有查询字符串的 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.phpURI 路径。在这种情况下,您仍然需要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不会受到此问题的影响。

相关内容