我有两个作为子域名托管的网站。
其中一个站点使用子域名作为动态图像请求的别名。
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
要处理前两项,您需要使用SetEnvIf
和Satisfy
,如下所示:
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