7

我有一个基于子域提供某些内容的网站。所以它是同一组文件,并且可能站点页面中的标题和一些信息会根据子域而变化。

我还需要基于子域进行不同的 htpassword 身份验证,但在 htaccess 中找不到有关如何执行 if/then 类型的信息的信息。

基本上我需要的是这样的:

如果 subdomain = 'abc' 使用这个 htpassword 文件

如果 subdomain = 'def' 使用这个 htpassword 文件

这可以做到吗?

4

5 回答 5

4

尝试这样的事情:

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

<IfDefine HOST_ABC>
    AuthUserFile …
</IfDefine>
<IfDefine HOST_DEF>
    AuthUserFile …
</IfDefine>
于 2009-08-06T15:50:02.200 回答
0

您使用的是哪个网络服务器?

一种可以在多个不同服务器上工作的技术(它当然可以在 apache 中工作)是在与每个子域对应的目录中具有不同的 .htaccess 文件。

于 2009-08-05T18:28:40.043 回答
0

如果是我(而且我以前没想过这样做),我会:

  1. 根据某些因素(模拟 IF/ELSE),使用mod_rewrite使用内部重定向到不同的站点根目录(/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 提供相同的站点文件,具体取决于子域。

希望这会有所帮助,有点破解。

有兴趣看看是否存在更好的东西。

于 2009-08-05T18:33:40.830 回答
0

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

您还可以将一个 .htaccess 文件放在文件的上一级,并使用 <Directory something> 为每个子域指定不同的规则,但使子域目录都成为与共享文件相同的目录的符号链接。

所以这将是 Web 根目录上方的目录:
.htaccess
sitefiles
subdomain1 (symlink to sitefiles)
subdomain2 (symlink to sitefiles)
...

于 2009-08-05T18:37:32.240 回答
0

您可以使用带感叹号的伪 else。请参阅下面示例中的第二个指令MemCachevs !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

于 2019-12-30T13:13:54.070 回答