我的应用程序的路由脚本期望 URI 为
/api/v0/create
我的请求
http://my-server.test/subdir/api/v0/create
如何配置 nginx 以从 URI 中删除“/subdir”,从而为应用程序的路由器提供预期的路径?
我尝试了这个,但是只从服务器(而不是应用程序)收到“404 文件未找到”:
location /subdir/api/ {
rewrite ^/subdir(.*)$ $1 last;
try_files $uri $uri/ /subdir/api/public/index.php$is_args$args;
}
使用重写标志break
并且没有该rewrite
部分,我从我的应用程序获得 404,因为子目录仍然在 URI 中。
编辑:
我需要一种不重定向到 /api 的方法,因为还有另一个模拟 URIhttp://我的服务器.测试/anothersubdir/api/v0它具有相同的 /api 部分。
所有这些都归结为一个问题:有没有办法配置 nginx 以便为目标应用程序提供重写的 URI,例如 php 中的 $_SERVER['REQUEST_URI'] 可以反映它?
编辑:这是完整的 nginx 配置:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
# configuration file /etc/nginx/mime.types:
types {
text/html html htm shtml;
... omitted
}
# configuration file /etc/nginx/conf.d/php.conf:
server {
listen 80;
server_name my-server.test;
root /var/www;
location /subdir/api/ {
rewrite ^/subdir(.*)$ $1 last;
try_files $uri $uri/ /subdir/api/public/index.php$is_args$args;
location ~* \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
}
}
感谢您的帮助!
答案1
您没有任何位置块可以处理重定向后的请求(假设重写后,您的请求从 更改为/subdir/api/v0/create
此/api/v0/create
,没有匹配的块可以处理此类请求。我建议取出外面的嵌套位置块,并添加根位置块(如果需要)
server {
listen 80;
server_name my-server.test;
root /var/www;
location /subdir/api/ {
rewrite ^/subdir(.*)$ $1 permanent;
try_files $uri $uri/ /subdir/api/public/index.php$is_args$args;
}
location ~* \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
location / {
<REST OF YOUR CONFIGURATION>
}
}