如何使用 .htaccess 和 .htpasswd 进行选择性重定向和密码

如何使用 .htaccess 和 .htpasswd 进行选择性重定向和密码

在我的/var/www/目录中,我有许多目录,例如:

/var/www/impdata/
/var/www/data/

那么我可以实现这个吗:

当我去:www.websitename.com/data/它应该给出一个404错误。

当我这样做时www.websitename.com/data/welcome.php它应该有效。

当我这样做时,www.websitename.com/impdata/它应该要求输入用户名和密码。

当我这样做时www.websitename.com/impdata/welcome.php它应该有效。

那么我该如何编写.htaccess.htpasswd实现这一目标?

这是我当前的.htaccess文件,它位于/var/www/目录中:

   Options -Indexes
   DirectoryIndex disabled

   <Directory /var/www/impdata>
     # All access controls and authentication are disabled
     Satisfy Any
     Allow from all
  </Directory>

我当前目录.htpasswd中的文件/var/www/impdata/

 try:XYZXYZXYZXYZ

答案1

首先,.htaccess 文件旨在在放置它们的目录中生效,因此,通常不会在 /var/www/ 中有一个,而是在 /var/www/impdata/ 和 /var/www/data/ 中各有一个。

或者根本没有 .htaccess 文件:这是我最讨厌的事情,引自.htaccess 手册文件:

你应该完全避免使用 .htaccess 文件如果您有权访问 httpd 主服务器配置文件。使用 .htaccess 文件会降低 Apache http 服务器的速度。最好将 .htaccess 文件中包含的任何指令设置在目录块中,因为它将具有相同的效果且性能更好。

如果我正确理解了你的问题,当使用 www.example.com/data/ 时,你不想看到 index.html 或类似文件(如果存在),也不想看到文件列表,但是当从该目录请求特定文件时,你想允许用户访问该文件。

<Directory /var/www/data>
   Options -Indexes         
   DirectoryIndex disabled
</Directory> 

使用相同的选项向 /var/www/impdata 添加身份验证:

<Directory /var/www/impdata>
   Options -Indexes
   DirectoryIndex disabled
   AuthType Basic
   AuthName "RESTRICTED AREA"
   AuthUserFile /var/www/impdata/.htpasswd
   Require valid-user
</Directory>

您可以禁止该密码保护区域内的某些文件或目录需要使用Satisfy Any指示:

<File /var/www/impdata/welcome.php>
   # All access controls and authentication are disabled
   Satisfy Any
   Allow from all
</File>

答案2

那么我可以实现这个吗:当我访问 www.websitename.com/data/ 时,它应该会出现 404 错误。而当我访问 www.websitename.com/data/welcome.php 时,它应该可以正常工作。

您可以简单地将每个请求重写为 404 未找到状态,但 welcome.php 除外。在下面的代码中,您将看到每个规则都被重写为 404 状态,但 welcome.php 除外。

#.htaccess file of /var/www/data
RewriteEngine On

#Condition is that the requested URI is NOT data/welcome.php
RewriteCond ${REQUEST_URI} !^data/welcome.php$
#Return 404 by default
RewriteRule ^(.*)$ - [R=404,L]

当访问 www.websitename.com/impdata/ 时,它应该要求输入用户名和密码。当访问 www.websitename.com/impdata/welcome.php 时,它应该可以工作。

据我所知,.htaccess 文件是每个目录的,因此身份验证也是如此。但是,您可以做的是将所有不等于 welcome.php 的请求重定向到 php 脚本,然后该脚本发送身份验证请求。或者创建一个单独的目录,一个包含受保护的文件,一个不包含受保护的文件,然后重定向到这些特定目录。以下是 /impdata 不受保护但 /impdata/auth 受保护的示例。在这种情况下,/var/www/impdata/auth 包含 .htaccess 和 .htpasswd 要求,而 /var/www/impdata/ 包含处理重定向的文件。

#.htaccess of /var/www/impdata
RewriteEngine On

#Exception, if welcome.php is called, show it
RewriteCond %{REQUEST_URI} !^/impdata/welcome.php$
#Make sure the path does not already exist out 
#of /impdata/auth/ as it would cause a redirect loop.
RewriteCond %{REQUEST_URI} !^/impdata/auth/(.*)$ 
RewriteRule ^(.*)$ auth/$1 [L]


#.htaccess file of /var/www/impdata/auth
Options -Indexes
AuthType Basic
AuthName "RESTRICTED AREA"
AuthUserFile /var/www/impdata/.htpasswd
Require valid-user

相关内容