Nginx:路由到特定path组件的别名内的index.php

我正在尝试使nginx路由到特定path的别名内的index.php。 只是使用子域会更容易(并添加不同名称的服务器块),但是我的项目需要这个结构来解决几个非主题的问题。 简而言之,我想要以下几点:

1. www.example.com --> /home/user/www/public/index.php 2. www.example.com/a/b --> /home/user/www/public/index.php 3. www.example.com/api --> /home/user/api/public/index.php 4. www.example.com/api/a/b --> /home/user/api/public/index.php 

数字1和2是非常标准的:始终服务于index.php文件(在某个根目录中),让PHP负责路由。 数字3模拟一个子域的build设(并应指向不同的目录index.php)。

我已经设法得到数字1-3工作,但不是数字4.每当我去www.example.com/api/a/b它给出了404。错误日志告诉我nginx正试图为我/家庭/用户/ API /公共// A / b /。 我觉得我很接近解决scheme,但我似乎没有把握好。 我也可以以相同的方式提供静态文件。

以下configuration是相关的:

 server { listen 80; server_name example.com www.example.com; root /home/user/www/public; index index.php index.html; location / { try_files $uri $uri/ /index.php; } location ~ \.php$ { try_files $uri /index.php =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_index index.php; fastcgi_pass unix:/var/run/php5-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location /api { alias /home/user/api/public/; location ~ \.php$ { try_files $uri /index.php =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_index index.php; fastcgi_pass unix:/var/run/php5-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } } 

提前致谢。

 server { listen 80; server_name example.com www.example.com; root /home/user/www/public; index index.php index.html; location / { try_files $uri $uri/ /index.php; } location ~ \.php$ { try_files $uri /index.php =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_index index.php; fastcgi_pass unix:/var/run/php5-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location /api/ { alias /home/user/api/public/; try_files $uri /api/index.php =404; location ~ \.php$ { try_files $uri /index.php =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_index index.php; fastcgi_pass unix:/var/run/php5-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } } 

你很近 但是您需要匹配location的尾部/字符及其对应的alias

您还需要在该块中添加一个try_files来引用正确的index.php ,该文件可能是/api/index.php

  location /api/ { alias /home/user/api/public/; try_files $uri /api/index.php;