Php ssl\u客户端上的nginx位置匹配\u验证
我正在尝试设置nginx,以便匹配授予条件访问权限的服务器上的特定URL(即,仅允许具有有效客户端证书的用户访问此区域) 现在,简单的位置块可以很好地防止未经授权的用户访问: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
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与上游对话,就是这样。