我有一个正在运行的 VPSOpenBSD 7.4 x64其中托管我的个人网页。该网页使用 OpenBSD 提供的本机 http 守护进程,而不是 Apache 服务器。我希望我的网站的大部分内容向遇到该网站的任何人开放,但出于隐私目的,我希望某些页面仅对经过身份验证的用户可见。我在网上搜索了有关如何实现这一目标的文档,但大部分都是空手而归。
到目前为止,我发现我需要authenticate
在文件中添加一条语句/etc/httpd.conf
来提示用户输入用户名和密码,然后根据.htpasswd
我之前为受保护领域创建的文件进行检查。我还发现,一个人可能有多个“领域”,.htpasswd
每个“领域”都有不同的文件。我的问题是,我无法正确设置该/etc/httpd.conf
文件,以便它要求身份验证,然后在收到正确的信息后允许用户通过。
看来,OpenBSD 原生 http 守护进程的采用率还比较小,至少与 Apache 服务器的采用率相比是这样。除了 OpenBSD 的联机帮助页之外,我还没有找到任何关于它如何工作的彻底解释,虽然很多人说它们非常彻底,但我在完全理解方面仍然遇到了一些困难。
这对我来说是一个非常新的事情,事实上我只能首先设置所有这些,因为我使用了脚本是别人写的并跟随他们的指示。
为了总结这一切,我想以递归方式对文件夹/目录及其所有子文件夹/子目录进行密码保护。我想这类似于添加authenticate "realm" with "[.htpasswd file]"
到server
我的httpd.conf
.问题是,当我尝试此操作时,服务器仅提示输入密码并立即再次提示输入密码,无论密码是否与.htpasswd
我之前创建的凭据匹配。如果我点击cancel
密码提示,服务器就会给我一个"401 Unauthorized"
页面。
这是一个将导致无限密码挑战的配置:
prefork 5
types {
include "[TYPES_FILE_LOCATION]"
}
server "[DOMAIN_NAME.COM]" {
listen on * port 80
location * {
block return 301 "https://$HTTP_HOST$REQUEST_URI"
}
location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
}
}
server "[DOMAIN_NAME.COM]" {
listen on 127.0.0.1 port 8080
default type text/html
[*** PROBLEM HERE v ***]
location "/[PROTECTED_FOLDER]" {
authenticate "realm" with "[.HTPASSWD_LOCATION]"
}
[*** PROBLEM HERE ^ ***]
location "/pub/*" {
directory auto index
}
}
此配置适用于常规 https 连接和 http -> https 连接。
我也尝试过
[*** PROBLEM HERE v ***]
location "/[PROTECTED_FOLDER]/*" {
authenticate "realm" with "[.HTPASSWD_LOCATION]"
}
[*** PROBLEM HERE ^ ***]
达到类似的效果。
以下是 users.htpasswd 文件和所有父目录的权限:
drwxr-xr-x 13 root wheel 512 Nov 29 19:00 /
drwxr-xr-x 27 root wheel 512 Nov 15 05:22 /var
drwxr-xr-x 11 root daemon 512 Jan 1 23:20 /var/www/
-rw------- 1 www daemon 68 Jan 1 23:29 /var/www/users.htpasswd
有谁知道我在这里做错了什么?我可能错过了什么资源吗?以下是我迄今为止发现的一些资源。
类似的问题#1-misc.openbsd.narkive.com
类似的问题#2 - reddit.com/r/openbsd 档案
httpd.conf 手册页 - man.openbsd.org 档案
非常感谢任何提示/帮助/指示。
答案1
这个最小配置对我有用,假设默认chroot
为/var/www
:
server * {
listen on * port 80
root "/htdocs/default"
directory auto index
location "/protected/" {
authenticate "realm" with "/auth/htpasswd"
}
}
types {
include "/usr/share/misc/mime.types"
}
/
请注意受保护目录名称的尾随。因为你已经对配置文件进行了如此大量的编辑,所以我无法判断你是否有这个。
mkdir /var/www/htdocs/default # Server document root
mkdir /var/www/htdocs/default/protected # Protected subdirectory
mkdir /var/www/auth # Directory to store htpasswd
htpasswd /var/www/auth/htpasswd test # User "test"; set your own password
chown www /var/www/auth/htpasswd # Fix ownership
rcctl enable httpd # Enable the service
rcctl restart httpd # (Re)start the web server
location "/pub/*"
如果您想使用诸如包含通配符之类的指令,则必须使用location match "/pub/*"
.但我认为location "/pub/"
就足够了。