我有一个正在运行的网站,其中有一个特定的目录,我在其中存储随机的东西(这听起来很不正式,事实上也是如此)。
所以,我希望在那里有某种索引来列出该目录(和子目录)的内容。autoindex
会完美地工作。
然后,我真的不想让其他人浏览该索引。auth_basic
可以完美地工作。
但是,我希望能够链接到该目录内的特定文件或目录(即做包含索引文件,而不是自动索引) 且无需密码保护。
所以,最终的想法是有一个自动索引密码保护基本认证但其余文件和目录保持不变。
我想出了一个巧妙的解决方案这样可行:由于访问不存在的索引时会发出 HTTP 状态 403,因此我将其重定向到location
启用的autoindex
自定义块auth_basic
。
请看此处的示例:
server {
root ...;
index index.php index.html index.htm;
server_name ...;
access_log ...;
error_log ...;
# general site
location / {
try_files $uri $uri/ @rewrite;
location ~ \.php(/|$) {
include fastcgi.conf;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
try_files $uri $uri/;
fastcgi_pass unix:/run/php/php-fpm-....sock;
}
}
# rewrite for the general site
/location @rewrite {
rewrite ...;
}
# that specific directory
location /directory {
try_files $uri $uri/ =404;
error_page 403 = @autoindex; # hack 1
location ~ \.php(/|$) {
# include snippets/fastcgi-php.conf;
include fastcgi.conf;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
try_files $uri $uri/;
fastcgi_pass unix:/run/php/php-fpm-....sock;
}
}
# password-protected autoindices
location @autoindex {
autoindex on;
autoindex_exact_size off;
auth_basic "directory";
auth_basic_user_file /.../.htpasswd;
}
}
那么... 有更好的办法吗?这种破解方法是不是一个坏主意?
谢谢你!
答案1
因此,最终的想法是有一个具有自动索引的位置,该位置受基本身份验证的密码保护,但其余文件和目录保持不变。
尝试使用正则表达式location
指定您需要保护的任何位置basic_auth
。
基于前缀location
的总是先检查,但最后使用检查基于正则表达式的匹配location
。如果没有基于正则表达式的匹配当前请求,则将使用location
最长匹配的基于前缀的匹配。location
在这里你可以做类似的事情
index index.html;
location ~ /directory(/$|$) { # http://example.com/directory, http://example.com/directory/
autoindex on;
autoindex_exact_size off;
auth_basic "directory";
auth_basic_user_file /.../.htpasswd;
}
location /directory { # http://example.com/directory/favicon.ico
try_files $uri $uri/ =404;
location ~ \.php(/|$) {
# include snippets/fastcgi-php.conf;
include fastcgi.conf;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
try_files $uri $uri/;
fastcgi_pass unix:/run/php/php-fpm-....sock;
}
}
使用http://example.com
作为基本 URL:
- 根据指令,任何请求都将被编辑并
http://example.com/directory
启用。http://example.com/directory/
autoindex
auth_basic
location ~ /directory(/$|$)
- 任何其他请求都
http://example.com/directory/*
将根据location /directory
指令进行处理。