该网站位于共享主机上。我需要密码保护单个URL。
http://www.example.com/pretty/url
显然,这不是我试图保护的物理文件路径,而只是那个特定的网址。
.htaccess的任何快速解决方案?
答案 0 :(得分:64)
您应该可以使用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
答案 1 :(得分:15)
您可以在<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>
如果要将正则表达式与漂亮的URL匹配,可能会发现<LocationMatch>
更有用。文档为here。
答案 2 :(得分:7)
由于Rick在评论中表示这个问题没有答案,所以这是我使用的片段:
chips = remainedwhenwin;
如果你需要支持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
<RequireAny>
Require env noauth
Require valid-user
</RequireAny>
Apache 2.2的代码取自Jon Lin。
答案 3 :(得分:4)
所有提供的解决方案对我来说都不起作用。我发现以下指令可以解决这个问题:
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
答案 4 :(得分:2)
在Apache2.4中,您可以执行以下操作:
<If "%{REQUEST_URI} =~ m#/pretty/url/?#i">
AuthUserFile /var/www/htpasswd
AuthName "Password protected"
AuthType Basic
Require valid-user
</If>
答案 5 :(得分:1)
我更新了Jon Lin的代码,目的是保护除URL以外的所有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>
答案 6 :(得分:0)
此命令:
htpasswd -c /etc/apache2/.htpasswd myuser1
如果您使用的是 Bitnami Apps (例如,打开edx),则需要遵循以下说明:
htpasswd -c /opt/bitnami/apps/edx/conf/.htpasswd myuser1
此配置:
<VirtualHost *:80>
...
<Location />
Deny from all
#Allow from (Set IP to allow access without password)
AuthUserFile /etc/apache2/.htpasswd
AuthName "Restricted Area"
AuthType Basic
Satisfy Any
require valid-user
</Location>
...
</VirtualHost>
此配置可保护所有URL。
<Location />
Deny from all
#Allow from (Set IP to allow access without password)
AuthUserFile /opt/bitnami/apps/edx/conf/.htpasswd
AuthName "Restricted Area"
AuthType Basic
Satisfy Any
require valid-user
</Location>
在Bitnami应用中:
/opt/bitnami/ctlscript.sh restart apache
答案 7 :(得分:-1)
不幸的是我不能评论@ 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>
答案 8 :(得分:-2)
上面的解决方案太忙了,搞砸了一下......我这样简单明了地说道。
<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才能使代码正常工作,但通常它是预先设置的,因此除非您自己定制构建,否则应该安全无虞。