我正在尝试使用 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;
}
只需将 改为 ,+
这样*
当/
其后没有其他内容时就可以匹配。