Nginx + PHP-FPM重定向到静态PHP文件

Some details about my setup first:

  • I am serving a static webapp (HTML + JS) from default Nginx webroot
  • I have a PHP-FPM server running on localhost:9000
  • The destination file should be /api/webroot/index.php for FPM (always, no need to try_files etc.)
  • I need to forward all /api and /api-debug calls to arrive at localhost:9000, and the /app/webroot/index.php should handle all these requests.

I have the following working Nginx configuration:

upstream fastcgi_backend {
    server localhost:9000;
    keepalive 30;
}

server {
    listen   80;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;

        location ~ ^/(api|api-debug)/ {
            root       /app/webroot;
            index      index.php;
            try_files  $uri /api/index.php$is_args$args;

            location ~ \.php$ {
                fastcgi_pass   fastcgi_backend;

                fastcgi_split_path_info ^(?:\/api\/)(.+\.php)(.*)$;
                fastcgi_param  SCRIPT_FILENAME /app/webroot/$fastcgi_script_name;

                include        fastcgi_params;
            }
        }
    }
}

I just want to make it more simple and efficient, because as I see it now it's a mess. I tried to adjust for example

try_files $uri /api/index.php$is_args$args;

to

try_files $uri /api/webroot/index.php$is_args$args;

and it failed... The only reason that it works is that /api/index.php includes /api/webroot/index.php, but I see it's inefficient.

I found debugging nginx config hard, because it's not easy to test.

Thank you very much for your help in advance!

展开翻译

译文

有关我的设置的一些详细信息:</ p>


  • I 我从默认的Nginx webroot提供静态webapp(HTML + JS)</ li>
  • 我有一个在localhost上运行的PHP-FPM服务器:9000 </ li>
  • 目标文件应该是/ FPM的api / webroot / index.php(总是</ strong>,不需要try_files等。)</ li>
  • 我需要转发所有 / api </ strong>和 / api-debug </ strong>调用到达localhost:9000,而/app/webroot/index.php应该处理所有这些请求。</ li>
    </ ul>

    < p>我有以下工作</ strong> Nginx配置:</ p>

      upstream fastcgi_backend {
    server localhost:9000;
    keepalive 30;
    } \ n
    server {
    listen 80;

    location / {
    root / usr / share / nginx / html;
    index index.html index.htm;

    location~ ^ /(api | api -debug)/ {
    root / app / webroot;
    index index.php;
    try_files $ uri / api / in dex.php $ is_args $ args;

    位置〜\ .php $ {
    fastcgi_pass fastcgi_backend;

    fastcgi_split_path_info ^(?:\ / api \ /)(。+ \。php)(。*) $;
    fastcgi_param SCRIPT_FILENAME / app / webroot / $ fastcgi_script_name;

    包括fastcgi_params;
    }
    }
    }
    }
    </ code> </ pre>

    我只是想让它变得更简单和有效,因为我现在看到它是一团糟。
    我试图调整例如</ p>


    try_files $ uri / api / index.php $ is_args $ args; </ p>
    </ blockquote>

    到</ p>


    try_files $ uri / api / webroot / index.php $ is_args $ args; </ p>
    </ blockquote>

    它失败了...唯一的原因是/api/index.php包含/ api / webroot /index.php,但我觉得效率很低。</ p>

    我发现调试nginx配置很难,因为它不容易测试。</ p>

    非常感谢你 非常适合您的帮助!</ p>
    </ div>

dsai1991
dsai1991 好的,我没注意到fastcgi_split_path_info从URI中删除/api/前缀。
接近 2 年之前 回复
dongweng9474
dongweng9474 最终目标是让这个工作:CakePHPdocs具有以下内容:-重写规则仅适用于以/api开头的URL-s-nginx服务器主机上的文件不可用(try_files会失败,我也不会看到任何需要它,只需将所有/api请求传递给localhost:9000/app/webroot/index.php以正确的重写形式)希望我在这里做了一些澄清。谢谢你的帮助!@RichardSmith
接近 2 年之前 回复
dongyun8891
dongyun8891 嗨理查德,谢谢你的回复。这两个文件都存在:/app/index.php和/app/webroot/index.php,其中/app/index.php只是/app/webroot/index.php的include语句。请注意,这些文件位于/app/xxx磁盘上,而不是/api/xxx。/api/只是URL。
接近 2 年之前 回复
duan7664
duan7664 根据您的问题,index.php位于/app/webroot/index.php。但根据您的工作配置文件,URI/api/index.php将解析为/app/webroot/api/index.php的路径名。将webroot添加到URI没有任何意义,你想要实现什么?
接近 2 年之前 回复

1个回答

The simplest solution would be to hardwire SCRIPT_FILENAME with a value of /app/webroot/index.php and remove one of your location blocks altogether.

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
}

location ~ ^/(api|api-debug)/ {
    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME /app/webroot/index.php;
    fastcgi_pass   fastcgi_backend;
}

Alternatively, to keep the flexibility of specifying a URI with a .php extension, you could simplify the configuration with:

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;

    rewrite ^/(api|api-debug)/ /index.php last;
}

location ~ \.php$ {
    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME /app/webroot$uri;
    fastcgi_pass   fastcgi_backend;
}

展开翻译

译文



最简单的解决方案是使用值 /app/webroot/index.php </ code>对SCRIPT_FILENAME进行硬连线处理, 完全删除一个 location </ code>块。</ p>

  location / {
root / usr / share / nginx / html;
index index.html index.htm;
}

location~ ^ /(api | api-debug)/ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /app/webroot/index.php;
fastcgi_pass fastcgi_backend;
} \ n </ code> </ pre>


或者,为了保持使用 .php </ code>扩展名指定URI的灵活性,您可以简化 配置:</ p>

  location / {
root / usr / share / nginx / html;
index index.html index.htm;

rewrite ^ /( api | api-debug)/ / index.php last;
}

location~ \ .php $ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME / app / webroot $ uri;
fastcgi_pass fastcgi_backend;
}

</ code> </ pre>
</ div>

dougou5844
dougou5844 如果你有任何@RichardSmith,我也会欣赏一些想法或一些短语来查找! 谢谢
接近 2 年之前 回复
dongtiao2066
dongtiao2066 对不起,我忘了这也应该适用于/ api-debug ...再次感谢你!
接近 2 年之前 回复
dsykx64220
dsykx64220 亲爱的理查德,经过几个小时的调试,我发现了应用程序需要的确切内容。 我之前没有详细注意这一点,因为我在框架附带的预先制作的.htaccess文件中使用了apache。 所以事实证明/ api / some / path / here?sample = querystring应该像这样结束:/app/webroot/index.php/api/some/path/here?sample=querystring,没有其他.php文件 将被处理,所以不需要第二个“位置〜\ .php $”块(我猜?)。 你能帮助我,让它尽可能干净和有效吗? 非常感谢您的慷慨帮助!
接近 2 年之前 回复
duannuochi3549
duannuochi3549 在上面的示例中,不会重写URI,因此所有FastCGI参数都是从原始请求派生的。 此外,root不在范围内,因此包含nginx默认值。 所有这些参数都在fastcgi_params文件中定义,因此您可以根据应用程序的需要覆盖它们,或使用底部示例。
接近 2 年之前 回复
douying9296
douying9296 嗨理查德,对/ api的调用在PHP-FPM上正确结束,但是我有一些重写问题,我粘贴了一个print_r($ _ SERVER); 这里。 你的配置结果在左边,我的工作配置在右边。 我唯一的问题是我不知道它是如何工作的,我不喜欢那样的东西......我应该用fastcgi_param替换所有变量吗? 还是有更清洁的解决方案? 谢谢!
接近 2 年之前 回复
dtu36380
dtu36380 谢谢理查德,我明天再试一次并报告回来!
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问