密码保护特定的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; } ?>
怎么了
- 用户请求
example.com/pretty/url
- 307redirect到
example.com/protected/login.php?url=pretty/url
- login
- 成功:用户通过密钥获得会话cookie
- 307redirect回
example.com/pretty/url
- 用户获得秘密内容
注意:当然,“会话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代码工作,但通常它是预先设置的,所以你应该是安全的,罚款,除非你自己定制。