【发布时间】:2014-03-05 03:39:41
【问题描述】:
当进行重写的位置块需要不同的根时,我很难理解如何控制对 PHP 脚本的重写。
这是简化的示例。我的包罗万象的前端控制器必须在 web 根目录下,但 firewall.php 脚本不能在。
这样做的目的是提供对不在根目录下的下载文件的门控访问。
server {
# Requests for media forced through firewall script outside web root
# /path/to/secure-area/firewall.php
#
location ^~ /downloads/ {
root /path/to/secure-area;
rewrite ^/.+$ /firewall.php last;
}
# Regular requests bootstrap front controller under web-root
# /path/to/web-root/index.php;
#
location / {
root /path/to/web-root;
index index.php
if ( -e $request_filename ) {
break;
}
rewrite ^.+$ /index.php last;
}
# Execute PHP via php-fpm
# rewrites hitting this are not mapping request_filename properly
#
location ~ \.php$ {
if ( !-f $request_filename ) {
return 404;
}
include /usr/local/nginx/conf/fastcgi_params;
fastcgi_pass unix:/tmp/php.sock;
fastcgi_index index.php;
}
}
显而易见的解决方案是拥有一个共同的根,但在我的情况下这是不可能的。我无法将安全位置放置在 Web 根目录下,并且 Web 根目录必须保持原样。
看起来root 指令仅在定义它的位置块内有效。重写单独工作正常,但是当~ \.php 块被击中时,根丢失了。
我显然做错了,那我应该如何实现呢?
【问题讨论】: