仅对某些子域文件夹进行 htaccess 保护

仅对某些子域文件夹进行 htaccess 保护

我有两个作为子域名托管的网站。

其中一个站点使用子域名作为动态图像请求的别名。

site1.example.com
site2.example.com
sub1.example.com -> same as site1
sub2.example.com -> same as site1
sub3.example.com -> same as site1

请求动态图像subX.example.com/images.php?

在 htaccess 中我想要:

  • 限制对 site1 和 site2 的访问(相同的用户和密码)
  • subX 上没有身份验证提示
  • 对于 subXs 请求,所有内容都重定向到 images.php

限制: 我没有权限访问 httpd.conf,所以没有目录块

我测试了 SetEnv、SetEnvIf 和 IfDefine,但均未成功。

答案1

要处理前两项,您需要使用SetEnvIfSatisfy,如下所示:

SetEnvIf Host site1.example.com need_auth
SetEnvIf Host site2.example.com need_auth

Order allow,deny

# setup whatever auth stuff you need here
AuthName "Private"
AuthType Basic
AuthBasicProvider file
AuthUserFile /etc/apache2/pwd

# here's where you actually check the credentials and env
Require valid-user
Allow from env=!need_auth
Satisfy Any

要进行重定向,您可以使用 mod_rewrite。我不太清楚你的意思,但如果你想一切重定向到 images.php,您可以执行以下操作:

RewriteCond %{ENV:need_auth} ^.*$
RewriteRule ^(.*)$ http://site1.example.com/images.php [R]

如果您在 subX.example.com 域的 vhost 文件中添加 RedirectMatch,那么可能会容易得多。.htaccess 文件旨在基于每个目录进行配置,而不是基于主机。它实际上并不是为执行您要求的操作而设计的。

答案2

我找到了一个解决方案。它的奇异性值得 A+。

在根目录 .htaccess 中:

AuthUserFile /var/www/.htpasswd # will be inherited by children directories .htaccess

在 site1 目录中的 .htaccess :

SetEnvIf host ^s[0-9]+\. sub # Detect if the host target a subdomain for images

AuthName "Restricted Area"
AuthType Basic

Order Deny,Allow
Require valid-user

# Access to anything except image.php is forbidden on subdomains for images
<FilesMatch .*>
    Deny from env=sub
</FilesMatch>

# Access to image.php does not required authentication in subdomains for images
<Files image.php>
    Allow from env=sub
    Satisfy any
</Files>

在 site2 目录下的 .htaccess 中:

AuthName "Restricted Area"
AuthType Basic

Order Deny,Allow
Require valid-user

相关内容