我有一个基于子域提供某些内容的网站。所以它是同一组文件,并且可能站点页面中的标题和一些信息会根据子域而变化。
我还需要基于子域进行不同的 htpassword 身份验证,但在 htaccess 中找不到有关如何执行 if/then 类型的信息的信息。
基本上我需要的是这样的:
如果 subdomain = 'abc' 使用这个 htpassword 文件
如果 subdomain = 'def' 使用这个 htpassword 文件
这可以做到吗?
我有一个基于子域提供某些内容的网站。所以它是同一组文件,并且可能站点页面中的标题和一些信息会根据子域而变化。
我还需要基于子域进行不同的 htpassword 身份验证,但在 htaccess 中找不到有关如何执行 if/then 类型的信息的信息。
基本上我需要的是这样的:
如果 subdomain = 'abc' 使用这个 htpassword 文件
如果 subdomain = 'def' 使用这个 htpassword 文件
这可以做到吗?
尝试这样的事情:
SetEnvIf Host ^abc\. HOST_ABC
SetEnvIf Host ^dev\. HOST_DEF
<IfDefine HOST_ABC>
AuthUserFile …
</IfDefine>
<IfDefine HOST_DEF>
AuthUserFile …
</IfDefine>
您使用的是哪个网络服务器?
一种可以在多个不同服务器上工作的技术(它当然可以在 apache 中工作)是在与每个子域对应的目录中具有不同的 .htaccess 文件。
如果是我(而且我以前没想过这样做),我会:
所以:
/sites/subdomain_a/.htaccess
/sites/subdomain_a/pub
/sites/subdomain_b/.htaccess
/sites/subdomain_b/pub
在哪里
/sites/subdomain_a/pub == /sites/subdomain_b/pub
使用
ln -s
或类似的。然后使用 mod_rewrite 将(内部)重定向到正确的站点根目录。我认为mod_rewrite 在加载 .htaccess 之前运行。
这意味着您有效地使用不同的 .htaccess 提供相同的站点文件,具体取决于子域。
希望这会有所帮助,有点破解。
有兴趣看看是否存在更好的东西。
您不能使用 if/else,因为 htaccess 不是指令列表。但是,如果您使用像 <IfModule mod_rewrite.c> 或 <IfDefine something> 这样的条件块,则可以根据请求的子域使用不同的指令。我不确定你会使用哪一个...
您还可以将一个 .htaccess 文件放在文件的上一级,并使用 <Directory something> 为每个子域指定不同的规则,但使子域目录都成为与共享文件相同的目录的符号链接。
所以这将是 Web 根目录上方的目录:
.htaccess
sitefiles
subdomain1 (symlink to sitefiles)
subdomain2 (symlink to sitefiles)
...
您可以使用带感叹号的伪 else。请参阅下面示例中的第二个指令MemCache
vs !MemCache
:
<IfDefine MemCache>
LoadModule mem_cache_module modules/mod_mem_cache.so
</IfDefine>
<IfDefine !MemCache>
LoadModule cache_disk_module modules/mod_cache_disk.so
</IfDefine>
取自 apache 文档:https ://httpd.apache.org/docs/2.4/mod/core.html#ifdefine