如何配置 nginx 以删除给予 index.php 的 URI 的一部分

如何配置 nginx 以删除给予 index.php 的 URI 的一部分

我的应用程序的路由脚本期望 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>
    }
}

相关内容