nginx 重写规则以覆盖 $uri

nginx 重写规则以覆盖 $uri

我有一个类似 的 URL ^/d/something/(.*)$,我想要做的是在内部重写它,不使用永久或临时的 HTTP 重定向,这样$_SERVER['REQUEST_URI']就只有$1而不是整个^/d/something/(.*)$。使用 nginx。

以下是我尝试过的:

location /d/something/ {
  rewrite "^/d/something/(.*)$" /$1 last;
}

location / {
    include php-fcgi.conf;
    try_files $uri $uri/ /index.php$args;
}

在 中php-fcgi.conffastcgi_param REQUEST_URI $request_uri;并且$request_uri保持不变,因此当我点击/d/something/something2symfony reouter 时,它依赖于$_SERVER['REQUEST_URI']显示/d/something/something2而我预计它只是/something2。我猜那是因为$request_uri没有改变。

如果我将其替换为,fastcgi_param REQUEST_URI $uri;$_SERVER['REQUEST_URI']变为/,无论我发送什么something2部分,它始终只是/。为什么会发生这种情况,我如何在内部将其重写为/$1

谢谢!

更新:内容如下php-fcgi.conf

location ~ \.php {
  include fastcgi_params;
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_read_timeout 60s;
}

答案1

我希望在请求传递到 PHP 脚本时$uri得到该值,所以我不明白您为什么会看到。然而.../index.php/

最简单的解决方案是从location重写 URI 的 中执行 PHP 脚本。这是通过使用rewrite...break并覆盖 REQUEST_URI 和 SCRIPT_FILENAME 参数来实现的。

例如:

location /d/something/ {
    rewrite "^/d/something/(.*)$" /$1 break;

    include fastcgi_params;
    fastcgi_param  REQUEST_URI      $uri;
    fastcgi_param  SCRIPT_FILENAME  $document_root/index.php;

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_read_timeout 60s;
}

放置fastcgi_param声明include声明。


或者,使用正则表达式 location块。请注意正则表达式 location块很重要。请参阅这个文件了解详情。

例如:

location ~ ^/d/something(/.*)$ {
    try_files /index.php =404;

    include fastcgi_params;
    fastcgi_param  REQUEST_URI  $1;

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_read_timeout 60s;
}

相关内容