【问题标题】:Nginx alias directive not working with phpNginx 别名指令不适用于 php
【发布时间】:2015-01-19 21:36:09
【问题描述】:

我有一个在 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 指令附加到 root 指令的末尾......所以,当你访问 /foo 时,Nginx 会尝试查找:

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

使用 alias 应该忽略 location 指令中设置的 /foo 并从确切的别名路径(日志确认正在发生)提供文件,但是当我使用 alias 指令时,php 配置未正确应用我得到了一个 404 的返回。

如果我返回根指令并完全删除“当前”目录,它可以正常工作。我需要从“当前”目录提供的文件才能顺利使用 Capistrano 部署,但无法弄清楚如何使别名指令与 php 一起使用。

任何人有任何想法或建议,我错过了什么吗?

【问题讨论】:

    标签: nginx php server


    【解决方案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 您能否澄清一下:您是否希望 location /foo 实际提供 php 文件?无论如何,它将由 php 位置处理,因为index 指令将发出 internal redirect 因此,当使用 alias 指令找到文件时,它现在也必须在 php 位置中找到。我敢打赌这是你的实际问题。您将无法将alias 指令与try_files 指令一起使用,因此您需要重写请求URI。请改用rewrite ^/foo/(.*)$ /$1 break;。调整两个位置的路径。
    • 感谢您的建议,只需删除 php 位置块中的 try_files 选项即可。
    【解决方案2】:

    感谢 @xavier-lucas 关于不能使用带有别名的 try_files 的建议。

    要在 php 中使用别名,我必须从原始问题中显示的 php 位置块中删除 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;
      }
    }
    

    这允许直接从别名指令中列出的目录处理 php 文件。

    【讨论】:

    • 您先生是个天才。我只浪费了一天时间尝试各种形式的配置。
    • hm...就我而言,它根本没有帮助。别名是“特殊的”。这一切都取决于fastcgi_param SCRIPT_FILENAME,事实是它设置在fastcgi_paramsfastcgi.conf 请参阅thisthis
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 2016-01-30
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多