![nginx 重写规则以覆盖 $uri](https://linux22.com/image/741712/nginx%20%E9%87%8D%E5%86%99%E8%A7%84%E5%88%99%E4%BB%A5%E8%A6%86%E7%9B%96%20%24uri.png)
我有一个类似 的 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.conf
有fastcgi_param REQUEST_URI $request_uri;
并且$request_uri
保持不变,因此当我点击/d/something/something2
symfony 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;
}