Nginx 重写 URI 以删除前缀?

Nginx 重写 URI 以删除前缀?

我有一个 slim 应用程序,我想将其放置在域的目录路径下。目前,我使用提供的默认 slim 文件可以正常工作,但我想设置重写规则。

我想要的重写规则是,只接受以 /foobar/ 为前缀的任何 URL,并在达到 slim 之前删除 /foobar/。这是我之前使用的 apache 配置中的等效重写规则,它完全按照我的要求工作:

RewriteEngine On
RewriteRule ^/foobar(/.*) /foobar/public/index.php$1 [QSA,L]

我们使用此重写规则的方法是,$_SERVER['REQUEST_URI'] 参数保持完整的“http://localhost/foobar/测试",但是路径(Slim 匹配路线的路径)只是“/test”,所以我们不需要明确创建路线组。

我的 nginx 配置目前如下:

server {
    listen 80;
    server_name  www.mysite.com mysite.com;
    root /var/www/mysite/foobar/public;

    # This is what I have tried adding, to no avail
    rewrite ^/foobar(/.*) /index.php$1 break;

    try_files $uri /index.php;

    location /index.php {
        fastcgi_connect_timeout 3s;
        fastcgi_read_timeout 10s;
        fastcgi_pass app:9000;     # "app" is a docker container

        include fastcgi_params;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

我已经尝试了好几个小时的各种规则。我不太确定自己在做什么,显然误解了 nginx 的工作原理,我相信 nginx 专家已经知道正确的答案。如果有人能提供我哪里出错的信息,我将不胜感激!

提前致谢!

更新尝试:

server {
    listen 80;
    server_name  www.mysite.com mysite.com;
    root /var/www/mysite;
    index index.php;

    location ~ ^/foobar(/.*)$ {
        root /var/www/mysite/foobar/public;

        fastcgi_connect_timeout 3s;
        fastcgi_read_timeout 10s;
        fastcgi_pass app:9000;

        include fastcgi_params;
        fastcgi_param PATH_INFO $1;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    }
}

答案1

你是对的,nginx 的重定向逻辑不同。

这种方法可能对你有用。但是,我还没有在使用这种模式的软件中使用过 nginx,所以我不确定这是否可行。此外,这可能不是执行此操作的最佳方式。

location ~ ^/foobar(/.*)$ {
    fastcgi_connect_timeout 3s;
    fastcgi_read_timeout 10s;
    fastcgi_pass app:9000;     # "app" is a docker container

    include fastcgi_params;
    fastcgi_param PATH_INFO $1;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}

相关内容