【问题标题】:Is there a way to check if a directory exists in Apache configuration files?有没有办法检查Apache配置文件中是否存在目录?
【发布时间】:2018-10-08 21:30:07
【问题描述】:

有没有办法根据目录是否存在在 Apache 中包含配置设置?基本上,我有一个便携式硬盘驱动器,可以在工作和家庭之间运输,上面有一些我正在开发的东西。如果文件夹存在,我只希望 Apache 配置加载特定的虚拟主机。

【问题讨论】:

    标签: apache directory


    【解决方案1】:

    从 Apache 2.4.34 开始,您现在可以使用 <IfFile>...</IfFile> 来检查文件是否存在。 <IfFile> 页面上有更多详细信息。

    【讨论】:

      【解决方案2】:

      不,似乎没有直接的方法可以做到这一点。

      可能的唯一解决方案是IfDefine 指令。您可以使用-d 参数定义定义到何时启动服务器。

      parameter-name 参数是在服务器启动时在 httpd 命令行上通过-Dparameter- 给出的定义。

      您可以检查批处理或 bash 文件中是否存在目录,并相应地设置 -d 参数。

      这是否是一个选项,将取决于您的服务器是如何从便携式硬盘启动的。

      【讨论】:

        【解决方案3】:

        我提出了一个似乎适用于 Linux 和 OS X 的解决方案,它取决于“挂载点”。也可以在 Windows 中模拟它,但您可能必须使用 FUSE 和/或 Cygwin 发挥创意。

        如果您在主目录中创建一个空文件夹,例如“/Users/username/ExtraVhosts”,则可以在“Include /Users/username/ExtraVhosts/*”中添加 apache 指令。

        然后,当您插入拇指驱动器时,您可以在某处挂载,然后使用挂载点“绑定”将 ExtraVhosts 文件夹交叉链接到移动设备上的文件夹。

        一个 OS X 示例:

        • 我有一个名为“Cherrybomb”的拇指驱动器
        • 当我插入它时,它总是安装到 /Volumes/Cherrybomb
        • 然后我可以使用 bindfs (sudo port install bindfs) 来挂载它的子文件夹,如下所示:
          • sudo bindfs /Volumes/Cherrybomb/Projects/vhosts /Users/username/ExtraVhosts
        • 然后我可以重新启动 apache 以读取更新的配置:
          • sudo /opt/local/apache2/bin/apachectl 重启

        此时,只需在 /etc/hosts 中添加条目以获取服务器别名即可。

        Linux 等价物将使用 mount 命令的“--bind”参数。

        一个警告:这使得快速卸载 USB 驱动器变得困难,因为它总是被 apache 标记为“正在使用”。这是一个删除过程:

        • 关闭所有打开的文件和正在使用驱动器的终端会话(终端中的当前工作目录可能会导致卸载问题)
        • 停止 apache:sudo /opt/local/apache2/bin/apachectl stop
        • umount /Users/username/ExtraVhosts

        然后您可以以图形方式或手动卸载它(umount /Volumes/Cherrybomb)。

        如果您的工作和家庭计算机将驱动器安装到不同的位置,您可以有多个 vhosts 文件夹 - home_vhost、work_vhost 等 - 并在绑定步骤中使用它们。

        我希望这可以帮助某人:)

        【讨论】:

          【解决方案4】:

          如果您仅将 apache 指向挂载点,则应该没有问题。只是不要将目录指令指向驱动器内的目录。

          例如,如果您挂载 /dev/somedisk /mnt/somevhost,则 /mnt/somevhost 目录将在那里,无论您是否安装了驱动器并且 apache 将启动。 Apache 不关心目录是否为空,因此如果驱动器未挂载,<Directory "/mnt/somevhost"/> 不会导致服务器无法启动。

          UNIX 一起工作而不是反对它:-p 这个解决方案应该足以用于开发。

          【讨论】:

          • 其实这不是问题。 Beryllium 解决方案的前提是该目录确实存在,在目标文件夹被挂载到它上面之前。子目录也是同样的逻辑。如果 /Volumes/Cherrybomb/public 存在,并且 Cherrybomb/public 存在,无论 Cherrybomb 是否挂载在 /Volumes/Cherrybomb 上,public 文件夹仍然存在
          猜你喜欢
          • 1970-01-01
          • 2010-11-12
          • 1970-01-01
          • 2012-02-18
          • 1970-01-01
          • 1970-01-01
          • 2010-10-26
          相关资源
          最近更新 更多