44

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

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

显然,这不是我要保护的物理文件路径,它只是那个特定的 URL。

.htaccess 有什么快速的解决方案吗?

4

10 回答 10

78

您应该能够使用 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
于 2013-01-30T13:20:56.597 回答
20

您可以使用<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 进行匹配,您可能会发现它更有用。文档在这里

于 2014-11-17T19:22:54.910 回答
13

由于 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

于 2017-07-21T15:22:27.113 回答
6

所有提供的解决方案都不适合我。我认为以下指令可以解决问题:

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
于 2016-08-10T12:41:20.820 回答
2

我更新了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>
于 2019-01-30T10:00:12.843 回答
2

在 Apache2.4 中你可以这样做:

<If "%{REQUEST_URI} =~ m#/pretty/url/?#i">
    AuthUserFile /var/www/htpasswd
    AuthName "Password protected"
    AuthType Basic
    Require valid-user
</If>
于 2020-05-26T06:34:12.533 回答
0

将用户重定向到受密码保护的子文件夹怎么样?

.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;
}
?>

发生什么了

  1. 用户请求example.com/pretty/url
  2. 307重定向到example.com/protected/login.php?url=pretty/url
  3. 登录
  4. 成功时:用户使用密钥获取会话 cookie
  5. 307重定向回example.com/pretty/url
  6. 用户获取机密内容

注意:当然,“会话 cookie 和反向重定向”机制是完全可选的。最后,您可以直接通过protected/login.php. 我展示这种方式只是为了获得灵感。

可选:不要使用 PHP 并通过 .htaccess 设置 cookie。

于 2017-02-23T23:44:48.700 回答
0
于 2019-07-08T07:23:34.053 回答
-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>
于 2015-10-06T18:28:42.653 回答
-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 才能使代码正常工作,但通常它是开箱即用的,因此除非您正在制作自己的自定义构建,否则您应该安全无虞。

于 2013-05-24T14:33:17.113 回答