我试图弄清楚为什么前置/
不允许\.php$
位置指令拾取脚本。
下面是一个示例.conf我用于nginx。我们正在运行API代码,在路径中进行版本控制://domian.com/v#.#/endpoint/uri
我们的document_root是版本号下面的一个目录; index.php
存在于版本目录中:path/to/sites/public/v1.0/index.php
index index.php # <-- this is in here globally
location ~ ^/(?<version>v[\d\.]+) {
try_files $uri $version/index.php?$args;
# Why does this NOT work? The / stopping \.php$ from matching
# try_files $uri /$version/index.php?$args;
}
location ~ \.php$ {
fastcgi_pass php56;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
[...]
}
我已经尝试过各种各样的事情,但似乎无法实现这一目标。删除/
后,它按预期工作,但我的SCRIPT_FILENAME行更改为:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
要:
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
这打破了直接的PHP文件调用 - 这是我不想要的。
编辑:解决方案:以下回答:问题与匹配顺序有关。首先找到模式匹配,而不是最后发现。
切换订单有效。第一个try_files
失败了,因为明确寻找以/
开头的模式。
我正在阅读:http://nginx.org/en/docs/http/request_processing.html
请求“/index.php”也与前缀位置“/”匹配 首先,然后通过正则表达式“。(php)$”。因此,由后一个位置处理,并且请求将传递给侦听localhost:9000的FastCGI服务器。
答案 0 :(得分:1)
首先要注意的是,正则表达式位置按文件顺序进行评估,因此如果/v1.1
与第一个位置块匹配,则/v1.1/index.php
也将匹配第一个位置块。您似乎通过创建缺少前导/
的错误URI来以错误的方式解决问题。
有关详细信息,请参阅this document。
您需要将location ~ \.php$
块放在 location ~ ^/(?<version>v[\d\.]+)
块之前,以便允许PHP块处理带有版本前缀的.php
个文件