Nginx别名指令与PHP不兼容

4

我有一个应用程序正在运行在Nginx上,并且有一个像下面这样工作的服务器块:

server {

  listen 80;
  server_name example.com;
  root /home/deployer/apps/my_app/current/;
  index index.php;

  location / {
    index index.php;
    try_files $uri $uri/;
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/home/deployer/apps/shared/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
  }

  location /foo {
    root /home/deployer/apps/modules/;
    # tried this:
    # alias /home/deployer/apps/modules/foo/;
    # but php is not working with alias, only with root
  }

}

当我访问/foo时,Nginx会在路径/home/deployer/apps/modules/foo/中寻找index.php文件,并且可以正常工作。
问题是:我使用capistrano设置了一个部署脚本,将其部署到foo目录中:
/home/deployer/apps/modules/foo/

Capistrano会在“foo”目录下创建一个“current”目录,用于存放从Github拉取的应用程序文件,因此我需要将根路径更改为:

/home/deployer/apps/modules/foo/current/

但是Nginx将location指令追加到根指令的末尾...因此,当您访问/foo时,Nginx会尝试查找:
/home/deployer/apps/modules/foo/current/foo/

使用别名应该忽略在位置指令中设置的/foo,并从确切的别名路径提供文件(日志证实正在发生),但是当我使用别名指令时,php配置无法正确应用,我收到了404错误。
如果我回到根指令并完全删除“current”目录,则可以正常工作。我需要从“current”目录提供文件以使Capistrano部署平稳进行,但无法弄清如何将别名指令与php配合使用。
有人有任何想法或建议吗?我是否漏掉了什么?
2个回答

7

感谢 @xavier-lucas 提供的关于无法在 alias 中使用 try_files 的建议。

为了在 php 中使用 alias,我不得不从原始问题中显示的 php location 块中删除 try_files 指令:

try_files $uri =404;

实际上,我不得不在/foo位置块内重新声明php位置块并删除上面的那一行。最终看起来像这样:

location /foo {
  alias /home/deployer/apps/modules/foo/;
  location ~ \.php$ {
    # try_files $uri =404; -- removed this line
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/home/deployer/apps/shared/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
  }
}

这样做可以直接从alias指令中列出的目录中处理php文件。

1
您真是个天才。我浪费了一整天的时间尝试各种配置。 - icc97
嗯...在我的情况下,这并没有帮助。别名是“特殊”的。这完全取决于fastcgi_param SCRIPT_FILENAME和它设置在fastcgi_paramsfastcgi.conf中的事实,请参见此处此处 - hrvoj3e

1
使用


location /foo/ {
    alias /home/deployer/apps/modules/foo/current/;
}

代替

location /foo {
    alias /home/deployer/apps/modules/foo/;
}

也许我没有提到过我尝试过那个...问题不在于我不能让Nginx查找正确的目录,而是即使它这样做了,php5-fpm也不会使用别名处理php文件 - 它会使用root(使用调试级别错误日志记录以验证正在提供的路径并验证该路径包含有效的index.php)。 - johndavid400
3
@johndavid400,你能否澄清一下:你希望/location/foo实际上提供PHP文件吗?因为index指令会发出内部重定向,所以即使找到带有别名指令的文件,它也必须在php位置中找到。我敢打赌这就是你的问题所在。你将无法将alias指令与try_files指令一起使用,因此您需要重写请求URI。请尝试改用rewrite ^/foo/(.*)$ /$1 break;。在两个位置上都适应路径。 - Xavier Lucas
1
感谢您的建议,只需在 PHP 位置块中删除 try_files 选项即可使其正常工作。 - johndavid400

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接