【问题标题】:Automation of Dynamic Virtual Host in Apache httpd-vhosts.conf and .htacces (XAMPP)Apache httpd-vhosts.conf 和 .htaccess (XAMPP) 中动态虚拟主机的自动化
【发布时间】:2013-02-25 14:34:04
【问题描述】:

我正在尝试在我的本地开发机器上设置一些自动化。通常我的所有项目都是这样开始的

打开 Hosts 文件,设置一个 DNS 条目,如 127.0.0.1 example.com www.example.com 打开httpd-vhosts.conf 文件并添加一个条目,如下所示

<VirtualHost *>
    DocumentRoot "/path/to/xampp/htdocs/example.com"
    ServerName example.com
    ServerAlias www.example.com
</VirtualHost>

我想要实现的是以这样一种方式设置环境,我不应该在每次我想在新主机上工作时都在我的httpd-vhosts.conf 中添加这个条目。

我希望在httpd-vhosts.conf 中有一个全局条目,它可以处理所有域并将它们映射到各自的目录

所以如果我的hosts 文件中有这样的记录列表

127.0.0.1 example.com
127.0.0.1 mysite.com
127.0.0.1 google.com
127.0.0.1 abc.com

还有这样的文件夹结构

/htdocs/
    /example.com/
    /mysite.com/
    /google.com/
    /abc.com/

它应该自动映射到这些目录,而无需在httpd-vhosts.conf 文件中添加VirtualHost 记录。

我猜想这可以通过在httpd-vhosts.conf 中添加通配符条目(我不知道如何)然后在.htaccess 文件中添加一些重定向规则来放置/htdocs/ 以将它们映射到它们的目录.

所以最终,

  1. 如何在httpd-vhosts.conf 中设置通配符条目
  2. 如何在/htdocs/ 中的.htaccess 文件中设置精确的重写规则@

这是我想到的,也许还有更好的方法。

【问题讨论】:

  • 要使任何解决方案都能正常工作,您必须将域停放/添加到您的服务器。因此,在添加域时,请多花 5 秒时间将其直接指向所需的目录。我必须强调:反正你要把它停在它所属的地方。

标签: apache .htaccess xampp vhosts


【解决方案1】:

1。如何在httpd-vhosts.conf 中设置通配符条目

通过在域名前面放置一个星号 (*),您通常会在其中放置 www

<VirtualHost *>
    DocumentRoot "/path/to/xampp/htdocs/example.com"
    ServerName example.com

    ServerAlias *.example.com

</VirtualHost>

2。如何在 /htdocs/ 中的 .htaccess 文件中设置精确的重写规则

RewriteEngine On
#RewriteCond %{HTTP_HOST} ^!example.com #(optional) do not redirect base domain
RewriteCond %{HTTP_HOST} (?(?=[a-z0-9\-\_]+\.[a-z0-9\-\_]{2,}$).+|[a-z0-9\-\_]+\.[a-z0-9\-\_]{2,})$
RewriteRule ^$ http://localhost/%0

所有这些域:

www.example.com
img.example.com
cdn.example.com
static.img.example.com

将被重定向到/example.com。

说明

上面的内容本质上是采用由 perdiod 分隔的最后两个字符串,并将您重定向到新找到的文件夹。


从技术角度:

这个正则表达式使用if then|else 模式。如果找到1,则执行2,否则执行3。

做一个测试,然后根据(?(?=[a-z0-9-_]+.[a-z0-9-_]{2,}$).+|[a-z0-9-_]+.[a-z0-9-_]{2,}$)(?(?=[a-z0-9-_]+.[a-z0-9-_]{2,}$).+|[a-z0-9-_]+.[a-z0-9-_]{2,}$)

文本的结果选择两个选项之一
  1. (<strong>IF</strong>) 断言下面的正则表达式可以匹配,从这个位置开始(正前瞻)(?=[a-z0-9\-\_]+\.[a-z0-9\-\_]{2,}$)
    • 匹配下面列表中的单个字符[a-z0-9\-\_]+
      • 在一次和无限次之间,尽可能多次,按需回馈(贪婪)+
      • “a”和“z”范围内的字符a-z
      • 介于“0”和“9”之间的字符0-9
      • A - 字符\-
      • 一个_字符\_
    • 匹配字符“.”从字面上看\.
    • 匹配下面列表中的单个字符[a-z0-9\-\_]{2,}
      • 在 2 次和无限次之间,尽可能多次,按需回馈(贪婪){2,}
      • “a”和“z”范围内的字符a-z
      • 介于“0”和“9”之间的字符0-9
      • A - 字符\-
      • 一个_字符\_
    • 在字符串末尾(或字符串末尾的换行符之前,如果有的话)断言位置$
  2. (<strong>THEN</strong>)如果测试成功,匹配下面的正则表达式.+
    • 匹配任何不是换行符的单个字符.+
    • 在一次和无限次之间,尽可能多次,按需回馈(贪婪)+
  3. (<strong>ELSE</strong>)如果测试失败,如果测试成功则匹配下面的正则表达式[a-z0-9\-\_]+\.[a-z0-9\-\_]{2,}$
    • 匹配下面列表中的单个字符[a-z0-9\-\_]+
    • 在一次和无限次之间,尽可能多次,按需回馈(贪婪)+
    • 介于“a”和“z”之间的字符a-z
    • 介于“0”和“9”之间的字符0-9
    • A - 字符\-
    • 一个_字符\_
    • 匹配字符“.”从字面上看\.
    • 匹配下面列表中的单个字符[a-z0-9\-\_]{2,}
    • 在 2 次和无限次之间,尽可能多次,按需回馈(贪婪){2,}
    • “a”和“z”之间的字符a-z
    • 介于“0”和“9”之间的字符0-9
    • A - 字符\-
    • 一个_字符\_
  4. 在字符串末尾(或在字符串末尾的换行符之前,如果有的话)断言位置$

测试套件:

a.bc
ab.cd
abc.def
ab.cd.ef
12.34
12.34.56
1.2.3.4.5.67
cnn.com
no_country.for.old.men

【讨论】:

  • 太棒了!谢谢你..我几乎要说..只有两件事,当我打开example.com时,它重定向到example.com/example.com/,其次将example.com和www.example.com指向相同的规则是什么example.com 的文件夹。 (我猜要添加 2 条规则?)
  • 以上就是这样做的。如果你有www.example.com 和example.com 和img.example.com 和cdn.example.com 他们都将被重定向到/example.com
  • 酷,但是当我打开 example.com 时,它重定向到 example.com/example.com/ 的问题仍然存在.. 你能帮我解决这个问题吗? (赏金):-)
  • @AtifMohammedAmeenuddin 添加了RewriteCond %{HTTP_HOST} ^!example.com 这将阻止它转到example.com/example.com
  • 好吧,那就让它再次硬编码,我将不得不为每个域添加重写条件。我想说的是,这不仅限于示例 .com,只需将任何站点例如 a.com,它重定向到 a.com/a.com,如果您使用 mysite.com,它会重定向到 mysite.com /mysite.com
【解决方案2】:

您有多种方法来管理此任务。 apache httpd 网站上甚至还有一个special documentation page。

这导致了几种方法:

  • mod_rewrite (dedicated page),瑞士刀,但在我看来,这会导致一些神秘的语法和奇怪的行为
  • mod_vhost_alias,当然是设置简单虚拟主机的最简单方法(就像您通常使用的一样简单)

对于更复杂的虚拟主机,您应该查看mod_macro,这是一个很棒的模块。使用此模块,您可以编写带有多个参数的虚拟主机模板(不仅是域和文档根目录,您可以考虑的任何变量),然后只需添加一行调用该宏并带有每个虚拟主机的所有参数。

【讨论】:

    【解决方案3】:

    我会编写一个小脚本来从域/站点列表中生成虚拟主机配置文件,将所有虚拟主机配置文件放在一个单独的目录中,然后在我的 httpd.conf 中的 Include 指令中使用以包含所有该目录中的配置文件。

    【讨论】:

    • 感谢您的回复,但这样我每次想添加新域时都必须运行该脚本。我实际上希望消除这里的步骤
    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2015-02-24
    • 2011-10-16
    • 2013-09-08
    相关资源
    最近更新 更多