密码保护特定的url

该网站是共享主机。 我需要密码保护一个单一的url。

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

显然,这不是我想要保护的物理文件path,而只是特定的URL。

任何使用.htaccess的快速解决scheme?

你应该能够使用mod_env和Satisfy any指令的组合来完成这个任务。 您可以使用SetEnvIf来检查Request_URI ,即使它不是一个物理path。 然后,您可以检查该variables是否在Allow语句中设置。 因此,无论您需要使用密码login,还是Allow您在没有密码的情况下login:

 # 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 

您可以在<VirtualHost>指令中使用<LocationMatch><Location>来执行此操作(假设您可以访问httpd.conf / vhost.conf,或者您可以在文档根目录中的.htaccess中join类似的内容)if你必须这样configuration你的网站)。

例如:

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

如果要将正则expression式与漂亮的URL进行匹配,可能会发现<LocationMatch>更有用。 文档在这里 。

所有提供的解决scheme都不适合我。 我发现下面的指令可以做到这一点:

 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 

由于里克在一个评论中说,这个问题没有答案,这里是我使用的片段:

 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 。

不幸的是,我不能评论@ jon-lin的答案。 所以,我创build了一个新的答案。 我在apache 2.4环境中改编的解决scheme是:

 # # 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> 

那么把用户redirect到一个受密码保护的子文件夹呢?

的.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. 307redirect到example.com/protected/login.php?url=pretty/url
  3. login
  4. 成功:用户通过密钥获得会话cookie
  5. 307redirect回example.com/pretty/url
  6. 用户获得秘密内容

注意:当然,“会话cookie和反向redirect”机制是完全可选的。 最后,你可以通过protected/login.php直接提供你的秘密内容。 我只是以这种方式来expression灵感。

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

上面的解决scheme是太忙了,搞砸了一点。我去这样简单和清晰

 <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是密码文件的完整path。 你完成了。

尽pipe您可能必须确保设置这些先决条件。 AllowOverride和AuthConfig是需要在Apache目录标记configuration代码工作,但通常它是预先设置的,所以你应该是安全的,罚款,除非你自己定制。