如果我有一个带有命名捕获的位置指令:
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;
}