Php ssl\u客户端上的nginx位置匹配\u验证

Php ssl\u客户端上的nginx位置匹配\u验证,php,nginx,Php,Nginx,我正在尝试设置nginx,以便匹配授予条件访问权限的服务器上的特定URL(即,仅允许具有有效客户端证书的用户访问此区域) 现在,简单的位置块可以很好地防止未经授权的用户访问: location ~ ^/protected/ticketing { if ($ssl_client_verify != SUCCESS) { return 401; } #need treatment of php files here after SUCCESS = $ssl_client_verif

我正在尝试设置nginx,以便匹配授予条件访问权限的服务器上的特定URL(即,仅允许具有有效客户端证书的用户访问此区域)

现在,简单的位置块可以很好地防止未经授权的用户访问:

location ~ ^/protected/ticketing {
         if ($ssl_client_verify != SUCCESS) { return 401; }
#need treatment of php files here after SUCCESS = $ssl_client_verify ?!
}
所以这里没有人可以访问/保护/购票/任何东西

但是。 当您实际提供了有效的证书,并且没有触发此返回401时,/protected/ticketing/index.php不会被上游FPM服务器解析,而是提供下载(即,内容配置设置为默认八位字节流)

有没有一种优雅的方法

我的上游定义为:

upstream backend {
server unix:/var/run/php5-fpm.sock;
}
PHP处理程序位置块:

location ~ [^/]\.php(/|$) {
 fastcgi_split_path_info ^(.+?\.php)(/.*)$;
 if (!-f $document_root$fastcgi_script_name){return 404;}
 fastcgi_pass backend; #pass request to the upstream
 fastcgi_index index.php;
 include fastcgi_params;
}

实际上,在
位置
使用
if
是由nginx机组人员完成的。 可能是在这里使用的一个选项。比如说

map $uri $secured_url {
        default false;
        "~*/secret" true;
}

map "$secured_url:$ssl_client_verify" $return_unauthorized {
        default 0;
        "true:FAILED" 1;
        "true:NONE" 1;
        "true:" 1;
}
其中,
“~*/secret”
是您试图保护的位置(在您的情况下,
“~/protected/ticketing”


然后您可以在
服务器
指令级别添加
if($return\u unauthorized){return 401;}

我最终得到了嵌套位置解决方案。它很脏,我相信一定有比这更好的解决办法

location ~ [^/]\.php(/|$) {
# 
#... other PHP related settings 
#... other PHP related settings 
#

fastcgi_pass backend;

location ~ ^/protected/ticketing {
        #check X.509
        if ($ssl_client_verify != SUCCESS) {return 401;}

fastcgi_pass backend; #this was still mandatory even though parent (.php) block already had this directive, but w/o putting pass here PHP won't get interpreted?!

}

}

你能尝试添加
try\u文件$uri$uri/=404进入您的
^/protected/ticketing
部分?它会向您发送文件,因为您的分区不是继承的,如果请求被票务捕获,默认情况下将不会用其他位置处理。我也尝试过类似的方法。我测试了你的提案,但仍然下载了php<代码>接受范围:字节连接:保持活动内容长度:19581内容类型:应用程序/八位字节流日期:2016年3月17日星期四16:18:29 GMT Etag:“55e0699c-4c7d”上次修改:2015年8月28日星期五14:01:00 GMT服务器:nginx
实际上不在,也是由nginx工作人员推荐的。因此,这是一个例外,但我确实同意,一般来说,这应该避免。关于我的问题和你的解决方案,我不确定这是最好的方法。这似乎很复杂。我所需要的基本上就是指示nginx与上游对话,就是这样。