nginx MVC 子目录重写

nginx MVC 子目录重写

我负责管理一个 Web 应用程序,该应用程序有一个包含大量遗留代码的基目录,以及一个我自己创建的子目录,其中包含基于 MVC 的 API,我们正在使用该 API 将前端慢慢迁移到 SPA 模型。所有者心急如焚,下令我们迁移到 nginx。

我有丰富的 Apache 重写经验,在 Apache 中设置它大约需要九秒钟。但是,正如人们很快指出的那样,nginx 不是 Apache。虽然我可以让应用程序的任一部分在 nginx 中独立运行,但当 API 位于其 /api/ 目录中时,我无法让 API 与主应用程序很好地配合使用。

我猜想这将是 location 指令的某种排列,其行为似乎与 Apache 中的行为类似。基本上,如果有任何东西到达 /api/ 目录,我需要使用重写将 uri 的其余部分传递给 /api/public/index.php:

^/(.*)$ public/index.php?_url=/$1;

任何帮助是极大的赞赏。

现有配置:

 server {
            listen          10.1.1.225:443 ssl;
            server_name dev.domain.com;
            ssl_certificate /etc/nginx/conf.d/chain.crt;
            ssl_certificate_key /etc/nginx/conf.d/4096_SSL.key;
            set $root_path '/usr/share/nginx/www';
            root $root_path/trunk;
            index index.php index.html;
            fastcgi_param ENV development;
            fastcgi_buffers 8 16k;
            fastcgi_buffer_size 32k;
            fastcgi_read_timeout 180;
            location / {
                    try_files $uri $uri/ =404;
            }

            location ^~ /api {
                    rewrite ^/(.*)$ public/index.php?_url=/$1;
            }

            fastcgi_intercept_errors off;

            location ~ \.php {
                    fastcgi_pass   unix:/var/run/php-fpm.sock;
                    fastcgi_split_path_info ^(.+\.php)(.*)$;
                    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                    include        fastcgi_params;
            }
    }

这个配置很丑陋,因为我已经玩了一整天了,但它应该能说明问题。

答案1

您说得对,nginx 不是 apache,这意味着您可能想到的大多数使用 rewrite 的地方都不合适。相反,您应该尝试使用try_files。例如:

location /api/ {
    try_files $uri /api/public/index.php?_url=$request_uri;
}

答案2

对于其他正在查看此更新的人:

location ^~ /api {
                    rewrite ^/(.*)$ public/index.php?_url=/$1;
            }

rewrite ^/api(/.*)$ /api/public/index.php?_url=$1 last;

相关内容