nginx 的 try_files 无法与位置模式捕获的变量配合使用

nginx 的 try_files 无法与位置模式捕获的变量配合使用

如果我有一个带有命名捕获的位置指令:

location ~ ^/api/(?<endpoint>[^/]+)(?<pathinfo>.*) {
    root /opt/software/endpoints;
    ## breaks the config:
    # try_files $endpoint.php =418;
    include fastcgi_params; # as supplied by debian 8 "jessie"
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_param  SCRIPT_FILENAME  $document_root/$endpoint.php;
}

如果没有 try_files,调用正确的 url 就会调用 php 文件并返回输出。

curl -s http://example.com/api/foo/param
> output of foo.php with param "param"

但是当我在配置中激活try_files时,curl总是返回418。

(原因是,我想指定一个内部重定向,以防不存在这样的端点,作为try_files的最后一个参数。但我认为=418更好地说明了这个困惑)

答案1

您应该捕获前导斜杠。URInginx具有前导斜杠,因此您的try_files指令(如您所拥有的)将始终失败。您已将斜杠重新添加到fastcgi_param SCRIPT_FILENAME指令中。

尝试这个:

location ~ ^/api(?<endpoint>/[^/]+)(?<pathinfo>.*) {
    root /opt/software/endpoints;
    try_files $endpoint.php =418;
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_param  SCRIPT_FILENAME  $document_root$endpoint.php;
}

相关内容