问题
我试图拒绝访问我的 Web 根目录中的两个文件 update.php、install.php,并要求对 apc.php(也是 Web 根目录)进行身份验证。
我认为我已经成功拒绝访问,但打开文件时它会被下载而不是运行。
例如,在输入我的 IPADDRESS/apc.php 身份验证后,它会下载到我的计算机而不是打开。update.php 也会发生同样的事情。
如果我删除引用这三个文件的块,它就会成功运行,但当然它们不会被阻止。我该如何解决这个问题?
迄今为止
(我已重新排列,将相关部分放在顶部。)
我认为问题是这样的:
我唯一能找到的匹配位置是 ^~,其他所有位置都被忽略了(为什么?),表达式 ^~ 在匹配后停止搜索,所以我认为它永远找不到 PHP 块。所以它会下载而不是运行。
我尝试将 php 配置添加到块中,如下所示:
location ^~ /update.php {
allow 127.0.0.1;
deny all;
fastcgi_param SCRIPT_FILENAME /srv/www/mysite/public$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
include /etc/nginx/fastcgi_params;
}
但这只会导致页面变得空白。
服务器配置
server {
listen 8080;
server_name website website.com;
access_log /srv/www/website/logs/access.log;
error_log /srv/www/website/logs/error.log;
root /srv/www/website/public;
location / {
index index.php index.html index.htm;
error_page 404 = @drupal;
}
##deny access to update and install for everyone except the server
location ^~ /update.php {
allow 127.0.0.1;
deny all;
}
location ^~ /install.php {
allow 127.0.0.1;
deny all;
}
##authentication required to access apc.php
location ^~ /apc.php {
auth_basic "Restricted access"; #realm
auth_basic_user_file /srv/www/website/public/.htpasswd-users;
}
##drupal rewrite rules
location @drupal {
rewrite ^(.*)$ /index.php?q=$1 last;
}
##secure private file directory
location ~* /privatefiles {
internal;
}
##Add headers to advagg
location ~* files/advagg_(?:css|js)/ {
access_log off;
expires max;
add_header ETag "";
add_header Cache-Control "max-age=290304000, no-transform, public";
add_header Last-Modified "Wed, 20 Jan 1988 04:20:42 GMT";
try_files $uri @drupal;
}
## Replicate the Apache <FilesMatch> directive of Drupal standard
## .htaccess. Disable access to any code files. Return a 404 to curtail
## information disclosure. Hide also the text files.
location ~* ^(?:.+\.(?:htaccess|make|txt|log|engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(?:\.php)?|xtmpl)|code-style\.pl|/Entries.*|/Repository|/Root|/Tag|/Template)$ {
return 404;
}
location ~ \..*/.*\.php$ {
return 403;
}
##rules for running php
location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
if ($uri !~ "^/default/files/") {
fastcgi_pass 127.0.0.1:9000;
}
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/website/public$fastcgi_script_name;
}
}
答案1
可能是这样的表达
location ^~ /...
错了吗?难道不应该是:
location ~ ^/...
?
这里为什么需要正则表达式?
location /install.php
应该可以。