如果未登录,则重定向到特定页面 - .htaccess

时间:2011-04-21 17:11:32

标签: php apache .htaccess

我在Windows PC上运行apache2和php5。

我使用.htaccess.htpasswd保护了我的目录。如果未设置登录信息,或者用户名 - 密码组合不正确,则默认情况下,如果用户尝试访问受保护的目录,浏览器将提示输入用户名和密码框。但我想将用户重定向到特定的地址或网址。简而言之,我想重定向用户而不是显示HTTP基本身份验证对话框。我怎样才能做到这一点?

提前致谢... :)

blasteralfred

5 个答案:

答案 0 :(得分:3)

我使用类似于AJ的方法。我的.htaccess文件非常类似于以下内容:

AuthUserFile /opt/www/htaccess
AuthType Basic

DirectoryIndex public.txt

<Files "secret.txt">
    require valid-user
    FileETag None
    Header unset ETag
    Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</Files>

<Files "public.txt">
    FileETag None
    Header unset ETag
    Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</Files>

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP:Authorization} !=""
RewriteRule ^$ secret.txt [L]

有了这个,该网站的行为如下:

1)访问基本网址 - &gt;查看来自public.txt的内容。 2)访问/secret.txt - &gt;提示进行身份验证,并显示secret.txt的内容。 3)再次访问基本URL - &gt;查看来自secret.txt的内容。

使用[L,R]代替[L]将使用302响应来处理重定向。如果您希望重定向在浏览器的位置字段中可见,这是一个不错的选择。

&lt; side&gt;是的,我意识到这是一个非常晚的答案。不过,谷歌搜索结果中的问题很高,所以我希望详细说明我的方法,以防我将来发现自己在做同样的搜索。如果其他人受益,那就更好了。&lt; / aside&gt;

答案 1 :(得分:2)

修改后的答案......我相信你可以用mod_rewrite做到这一点。这是我发现的一个例子:

# turn on rewrite engine
RewriteEngine on
# if authorization header is empty (non-authenticated client)
RewriteCond %{HTTP:Authorization} ^$
# redirect to new url
RewriteRule /current/path /new/path
警告说,我现在无法对此进行测试。试试吧,把它放在你的.htaccess中并改变路径以适应你的环境。

答案 2 :(得分:2)

除Apache之外,您还可以使用http authentication in PHP(通过.htaccess)。这可能会给你更多的控制权。

从手册:

if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text to send if user hits Cancel button';
    exit;
} else {
    // do the redirect here?
}

答案 3 :(得分:1)

回答说明:

您需要实现自定义身份验证,本机无法在身份验证失败时重定向。

解决方案:

使用HTML元标记的自定义ErrorDocument实现使验证失败成为可能,并让用户在验证成功时访问受保护区域(在输入用户和密码之前,服务器将始终在首次加载时抛出401,因为浏览器首先不期望这样的身份验证,并拒绝访问)

    AuthUserFile /path/to/users
    AuthName "Access Denied"
    AuthGroupFile /dev/null
    AuthType Basic
    Require valid-user

    ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=/failed.html\"></html>"

替代方案I:

自Apache 2.4以来。您可以使用mod_auth_form和htaccess进行高级身份验证并使用更可靠的解决方案

http://httpd.apache.org/docs/trunk/mod/mod_auth_form.html

备选方案II:

使用php处理401 ErrorDocument 401 /handle.php

http://php.net/manual/en/features.http-auth.php

扩展安全性:

    ErrorDocument 401 "<html><meta http-equiv=\"refresh\" content=\"0;url=/kickout.php\"></html>"
    ErrorDocument 400 /kickout.php
    ErrorDocument 403 /kickout.php
    ErrorDocument 500 /kickout.php
    Deny from all
    Allow from 192.200.x.x
    Allow from 192.200.x.x
    Allow from 127.0.0.1
    Allow from localhost

答案 4 :(得分:0)

我有同样的问题,虽然这是一个旧线程,但我最终只是使用401错误文档来显示特定页面,如果身份验证失败...

ErrorDocument 401 /not-logged-in.php

这似乎以一种简单的方式为我做了诀窍。