具有单入口点和 PATH_INFO 的 Nginx PHP-FPM

具有单入口点和 PATH_INFO 的 Nginx PHP-FPM

我正在尝试使用 php-fpm 配置 nginx,以便大多数请求都传递给单个 php 脚本。

目录布局如下:

assets/...
index.php

我希望 URL 的工作方式如下:

/ -> index.php
/foo -> index.php
/bar/baz?spam=ham -> index.php
/assets -> assets folder

index.php应分别PATH_INFO设置'/''/foo''/bar/baz'

我想到的最接近的配置如下:

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

location /assets {
    try_files $uri =404;
}

location /index.php {
    include snippets/fastcgi-php.conf;
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
}

但是,PATH_INFO总是有一个附加的/(例如'//'在第一种情况下)。更改为/index.php$url$is_args$args适用于所有情况,除了/导致 404 的情况。

我当然可以修改脚本来处理额外的内容/但感觉有点脏。

我一直在尝试搜索和阅读手册,但我无法弄清楚,有什么指点吗?

答案1

您评论说您的snippets/fastcgi-php.conf内容包含:

fastcgi_split_path_info ^(.+\.php)(/.+)$;

您会注意到,它与 URI 不匹配/index.php/,这解释了为什么您会收到 404 响应。

您可以通过将更正后的语句放在其后来覆盖该值snippets/fastcgi-php.conf(假设您不想编辑系统文件)。例如:

location / {
    try_files $uri /index.php$uri$is_args$args;
}
location /index.php {
    include snippets/fastcgi-php.conf;
    include fastcgi_params;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
}

只需将 改为 ,+这样*/其后没有其他内容时就可以匹配。

相关内容