密码保护特定的URL

时间:2013-01-30 12:04:29

标签: .htaccess password-protection

该网站位于共享主机上。我需要密码保护单个URL。

http://www.example.com/pretty/url

显然,这不是我试图保护的物理文件路径,而只是那个特定的网址。

.htaccess的任何快速解决方案?

9 个答案:

答案 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)

  1. 首先,您需要创建一个新的用户名/密码:

此命令:

htpasswd -c /etc/apache2/.htpasswd myuser1

如果您使用的是 Bitnami Apps (例如,打开edx),则需要遵循以下说明:

htpasswd -c /opt/bitnami/apps/edx/conf/.htpasswd myuser1
  1. 然后,如果您已定义虚拟主机,则需要将以下行添加到apache配置文件中。

此配置:

<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>
  1. 对于Bitnami Apps,您需要在‘/ opt / bitnami / apps / edx / conf / httpd-lms.conf’中添加以下配置:

此配置可保护所有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>
  1. 最后,您需要重新启动Apache服务器。

在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才能使代码正常工作,但通常它是预先设置的,因此除非您自己定制构建,否则应该安全无虞。