我能在htaccess中使用if/then/else吗?

7
我有一个网站,根据子域名提供特定的内容。因此,它使用相同的文件集,可能会根据子域名更改标题和一些站点页面中的信息。
我需要根据子域名设置不同的htpassword身份验证,但找不到如何在htaccess中执行if/then类型操作的信息。
基本上我需要这样做:
如果子域名='abc',则使用此htpassword文件
如果子域名='def',则使用此htpassword文件
这可以实现吗?
5个回答

4

尝试像这样:

SetEnvIf Host ^abc\. HOST_ABC
SetEnvIf Host ^dev\. HOST_DEF

<IfDefine HOST_ABC>
    AuthUserFile …
</IfDefine>
<IfDefine HOST_DEF>
    AuthUserFile …
</IfDefine>

这看起来很不错 - 由于时间限制,我最终只能在PHP中构建一个简单的身份验证,但我想在测试环境中尝试一下,因为它似乎很有道理。谢谢! - user151257
5
尽管看起来很迷人,但对我没有用。你能改进一下这个Gumbo吗? - Devrim

0

如果是我(我之前没有考虑过这个),我会:

  1. 使用 mod_rewrite 进行内部重定向,根据一些因素(模拟 IF/ELSE)将不同的站点根目录(/suba 或 /subb)重定向到不同的目录。
  2. 在公共目录上使用 符号链接,但不是在 .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提供相同的站点文件。

希望这有所帮助,有点像黑客技巧。

如果有更好的方法,很想看看。


0
你使用哪个Web服务器?
可能适用于多个不同的服务器的一种技术(它在Apache中肯定可行)是在对应于每个子域的目录中有一个不同的.htaccess文件。

根据发布的问题,它是相同的文件集,因此没有单独的目录。 - Amber
这是一个使用IISpassword和ISAPIrewrite3的Win 2003服务器。你的解决方案行不通,因为在文件系统中,子域名没有物理上不同的文件集 - 所有子域名都指向同一组文件,并且PHP根据子域名评估并显示不同的数据。谢谢。 - user151257

0

你不能使用if/else,因为htaccess不是一系列指令。但是,如果你使用类似于<IfModule mod_rewrite.c>或<IfDefine something>的条件块,你可以根据请求的子域名使用不同的指令。我不确定你会使用哪一个...

你也可以将一个.htaccess文件放在文件上面一级,并使用<Directory something>为每个子域名指定不同的规则,但要确保子域名目录都是符号链接到具有共享文件的相同目录。

所以这将是网站根目录的上一级目录:
.htaccess
sitefiles
subdomain1(符号链接到sitefiles)
subdomain2(符号链接到sitefiles)
...


0

您可以使用带有感叹号的伪 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接