该网站位于共享主机上。我需要对单个 URL 进行密码保护。
http://www.example.com/pretty/url
显然,这不是我要保护的物理文件路径,它只是那个特定的 URL。
.htaccess 有什么快速的解决方案吗?
该网站位于共享主机上。我需要对单个 URL 进行密码保护。
http://www.example.com/pretty/url
显然,这不是我要保护的物理文件路径,它只是那个特定的 URL。
.htaccess 有什么快速的解决方案吗?
您应该能够使用 mod_env 和Satisfy any
指令的组合来做到这一点。即使它不是物理路径,您也可以使用它SetEnvIf
来检查。Request_URI
然后,您可以检查变量是否在Allow
语句中设置。因此,要么您需要使用密码登录,要么Allow
无需密码即可登录:
# Do the regex check against the URI here, if match, set the "require_auth" var
SetEnvIf Request_URI ^/pretty/url require_auth=true
# Auth stuff
AuthUserFile /var/www/htpasswd
AuthName "Password Protected"
AuthType Basic
# Setup a deny/allow
Order Deny,Allow
# Deny from everyone
Deny from all
# except if either of these are satisfied
Satisfy any
# 1. a valid authenticated user
Require valid-user
# or 2. the "require_auth" var is NOT set
Allow from env=!require_auth
您可以使用<LocationMatch>
或简单地<Location>
在您的<VirtualHost>
指令中执行此操作(假设您可以访问您的 httpd.conf / vhost.conf - 或者,如果您必须以这种方式配置您的站点,您可以在文档根目录中的 .htaccess 中放置类似的内容) .
例如:
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/blabla
# Other usual vhost configuration here
<Location /pretty/url>
AuthUserFile /path/to/.htpasswd
AuthGroupFile /dev/null
AuthName "Password Protected"
AuthType Basic
require valid-user
</Location>
</VirtualHost>
<LocationMatch>
如果您想将正则表达式与漂亮的 URL 进行匹配,您可能会发现它更有用。文档在这里。
由于 Rick 在评论中表示此问题的答案无效,因此这是我使用的代码段:
AuthName "Protected Area"
AuthType Basic
AuthUserFile /path/to/your/.htpasswd
AuthGroupFile /dev/null
SetEnvIf Request_URI .* noauth
SetEnvIf Request_URI the_uri_you_want_to_protect !noauth
SetEnvIf Request_URI another_uri !noauth
SetEnvIf Request_URI add_as_many_as_you_want !noauth
<RequireAny>
Require env noauth
Require valid-user
</RequireAny>
如果您需要对 Apache 2.2 和 Apache 2.4 的支持(显然有两个版本并行运行的设置......):
AuthName "Protected Area"
AuthType Basic
AuthUserFile /path/to/your/.htpasswd
AuthGroupFile /dev/null
SetEnvIf Request_URI .* noauth
SetEnvIf Request_URI the_uri_you_want_to_protect !noauth
SetEnvIf Request_URI another_uri !noauth
SetEnvIf Request_URI add_as_many_as_you_want !noauth
<IfModule mod_authz_core.c>
<RequireAny>
Require env noauth
Require valid-user
</RequireAny>
</IfModule>
<IfModule !mod_authz_core.c>
Order Deny,Allow
Deny from all
Satisfy any
Require valid-user
Allow from env=noauth
</IfModule>
Apache 2.2 的代码取自Jon Lin。
所有提供的解决方案都不适合我。我认为以下指令可以解决问题:
SetEnvIf Request_URI ^/page-url auth=1
AuthName "Please login"
AuthType Basic
AuthUserFile "/www/live.example.com/files/html/.htpasswd"
# first, allow everybody
Order Allow,Deny
Satisfy any
Allow from all
Require valid-user
# then, deny only if required
Deny from env=auth
我更新了Jon Lin的代码,以保护除一个之外的所有 URL - 例如虚拟主机根目录下的 robots.txt。这些是 Apache 2.2 兼容指令。
<ifmodule mod_setenvif.c>
SetEnv require_no_auth=false
SetEnvIf Request_URI "^/robots.txt" require_no_auth=true
AuthType Basic
AuthName "Restricted"
AuthUserFile /home/someuser/.htpasswd
# Setup a deny/allow
Order Deny,Allow
# Deny from everyone
Deny from all
# 1. a valid authenticated user
Require valid-user
# or 2. the "require_no_auth" var is set
Allow from env=require_no_auth
# except if either of these are satisfied
Satisfy any
</ifmodule>
Apache 2.4 的相同代码
<ifmodule mod_setenvif.c>
SetEnv require_no_auth=false
SetEnvIf Request_URI "^/robots.txt" require_no_auth=true
AuthType Basic
AuthBasicProvider file
AuthName "Restricted"
AuthUserFile /home/someuser/.htpasswd
# grant access if either of these are satisfied
# 1. a valid authenticated user
Require valid-user
# or 2. the "require_no_auth" var is set
Require env require_no_auth
</ifmodule>
在 Apache2.4 中你可以这样做:
<If "%{REQUEST_URI} =~ m#/pretty/url/?#i">
AuthUserFile /var/www/htpasswd
AuthName "Password protected"
AuthType Basic
Require valid-user
</If>
将用户重定向到受密码保护的子文件夹怎么样?
.htaccess
RewriteCond %{HTTP_COOKIE} !BadHorsie=secret_cookie_key
RewriteRule ^(pretty/url)$ /protected/login.php?url=$1 [R=307,L]
受保护/.htaccess
AuthUserFile /usr/www/{YOUR_PATH}/protected/.htpasswd
AuthGroupFile /dev/null
AuthName "Protected"
AuthType Basic
require user BadHorsie
受保护/.htpasswd
BadHorsie:$apr1$fFbaaVdF$Q5ql58g7R4qlpMUDb/5A0/
受保护/login.php
<?php
if (isset($_GET['url']) && $_GET['url'] && $_GET['url'][0] != '/' && strpos($_GET['url'], '//') === false) {
setcookie('BadHorsie', 'secret_cookie_key', 0, '/');
header('Location: /' . $_GET['url'], true, 307);
exit;
}
?>
发生什么了
example.com/pretty/url
example.com/protected/login.php?url=pretty/url
example.com/pretty/url
注意:当然,“会话 cookie 和反向重定向”机制是完全可选的。最后,您可以直接通过protected/login.php
. 我展示这种方式只是为了获得灵感。
可选:不要使用 PHP 并通过 .htaccess 设置 cookie。
不幸的是,我无法评论@jon-lin 的答案。因此,我创建了一个新答案。我在 apache 2.4 环境中的适应解决方案是:
#
# password protect /pretty/url URIs
#
AuthType Basic
AuthName 'Authentication required'
AuthUserFile /path/to/.htpasswd
# Restrict access to some urls
SetEnvIf Request_URI ^/pretty/url auth=1
<RequireAll>
# require the auth variable to be set
Require env auth
# require an valid-user
Require valid-user
</RequireAll>
上面的解决方案太忙了,有点混乱。我喜欢这样简单明了
<Files "protected.html">
AuthName "Username and password required"
AuthUserFile /home/fullpath/.htpasswd
Require valid-user
AuthType Basic
</Files>
以上内容将被放入您的 htaccess 文件中,其中“protected.html”是您要保护的文件(可以是您想要的任何文件,例如 myphoto.jpg 或 document.zip,只需将其重命名为您的偏爱)。AuthUserFile 是密码文件的完整路径。你完成了。
尽管您可能必须确保已设置此先决条件。Apache 目录标签配置中需要 AllowOverride 和 AuthConfig 才能使代码正常工作,但通常它是开箱即用的,因此除非您正在制作自己的自定义构建,否则您应该安全无虞。