【问题标题】:Can I do an if/then/else in htaccess?我可以在 htaccess 中执行 if/then/else 吗?
【发布时间】:2009-08-05 18:25:55
【问题描述】:

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

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

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

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

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

这个可以吗?

【问题讨论】:

    标签: iis .htaccess isapi-rewrite


    【解决方案1】:

    试试这样的:

    SetEnvIf Host ^abc\. HOST_ABC
    SetEnvIf Host ^dev\. HOST_DEF
    
    <IfDefine HOST_ABC>
        AuthUserFile …
    </IfDefine>
    <IfDefine HOST_DEF>
        AuthUserFile …
    </IfDefine>
    

    【讨论】:

    • 这看起来很棒 - 由于时间限制,我最终不得不在 PHP 中构建一个简单的身份验证,但我想在测试环境中尝试一下,因为它似乎很有意义。谢谢!
    • 虽然看起来很迷人,但它对我不起作用。你会修改这个秋葵汤吗?
    【解决方案2】:

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

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

    【讨论】:

    • 根据发布的问题,它是同一组文件,因此没有单独的目录。
    • 它是一个 Win 2003 服务器,使用带有 IISpassword 和 ISAPIrewrite3 的 IIS。您的解决方案将不起作用,因为子域的文件系统中没有物理上不同的文件集 - 所有子域都指向同一组文件,PHP 评估子域并基于此显示不同的数据。谢谢..
    【解决方案3】:

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

    1. 使用 mod_rewrite 使用内部重定向到不同的站点根目录(/suba 或 /subb),具体取决于某些因素(模拟 IF/ELSE)
    2. 在公共目录上使用 symlinks,而不是 .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 有效地提供相同的站点文件。

    希望这会有所帮助,有点小技巧。

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

    【讨论】:

      【解决方案4】:

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

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

      所以这将是网络根目录上方的目录:
      .htaccess
      网站文件
      subdomain1(指向站点文件的符号链接)
      subdomain2(站点文件的符号链接)
      ...

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2021-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-25
          • 2013-02-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多