![nginx MVC 子目录重写](https://linux22.com/image/640826/nginx%20MVC%20%E5%AD%90%E7%9B%AE%E5%BD%95%E9%87%8D%E5%86%99.png)
我负责管理一个 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;