为什么try_files中的`/`会破坏`〜\ .php $`

时间:2016-07-22 16:02:29

标签: php nginx fastcgi

我试图弄清楚为什么前置/不允许\.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服务器。

1 个答案:

答案 0 :(得分:1)

首先要注意的是,正则表达式位置按文件顺序进行评估,因此如果/v1.1与第一个位置块匹配,则/v1.1/index.php也将匹配第一个位置块。您似乎通过创建缺少前导/的错误URI来以错误的方式解决问题。

有关详细信息,请参阅this document

您需要将location ~ \.php$放在 location ~ ^/(?<version>v[\d\.]+)块之前,以便允许PHP块处理带有版本前缀的.php个文件