我在 centos 服务器上安装了 nginx。我已阻止对我正在开发的测试网站的所有外部访问。使用此代码。
location / {
auth_basic "Administrator Login";
auth_basic_user_file /home/config-files/.htpasswd;
}
问题是它没有阻止对静态文件的访问。我仍然可以访问这样的文件。
wp-admin/images/icons32-vs-2x.png
wp-admin/css/colors/midnight/colors.min.css
wp-content/themes/testtheme/style.css
为什么 Nginx 没有阻止对这些文件的访问。
编辑这是完整的虚拟主机文件。
server {
listen 80;
server_name www.domainname.com;
root /home/myuser/domainname.com/public;
index index.html index.php;
access_log /home/myuser/domainname.com/logs/access.log;
error_log /home/myuser/domainname.com/logs/error.log;
location ~ /\.svn/* {
deny all;
}
location ~ \.(htaccess|htpasswd) {
deny all;
}
location ~ \.conf$ {
deny all;
}
location / {
try_files $uri $uri/ /index.php?$args;
auth_basic "Administrator Login";
auth_basic_user_file /home/config-files/.htpasswd;
}
location ~ \.(css|js) {
rewrite ^(.*/?)([a-z]+)-([0-9]+)\.(css|js)$ /$1$2.$4 last;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
location ~* \.(js|css)$ {
expires 30d;
log_not_found off;
}
location ~* \.(?:ico|gif|jpe?g|png|svg)$ {
expires 180d;
add_header Pragma public;
add_header Cache-Control "public";
log_not_found off;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$; #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
rewrite ^(.*)/undefined$ /$1 permanent;
rewrite ^(.*)/undefined/$ /$1 permanent;
}
答案1
nginx 不是按顺序匹配“位置”部分,而是按最具体的顺序匹配,请阅读这里。然后它只将最匹配的位置部分应用于请求,而不应用其他任何部分。因此,“location /”将仅对与任何其他位置部分都不匹配的请求起作用(所有位置部分都更具体)。
尝试将 auth 指令放在任何位置括号之外,直接放入 server{}。