4

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

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

<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/

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

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

所以最终,

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

这是我想到的,可能还有更好的方法来做到这一点。

4

3 回答 3

6

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找到,则执行2else do 3

做一个测试,然后根据文本的结果选择两个选项之一(?(?=[a-z0-9-_]+.[a-z0-9-_]{2,}$).+|[a-z0-9-_]+.[a-z0-9-_]{2,}$)

  1. (IF)断言下面的正则表达式可以匹配,从这个位置开始(正前瞻)(?=[a-z0-9\-\_]+\.[a-z0-9\-\_]{2,}$)
    • 匹配下面列表中的单个字符[a-z0-9\-\_]+
      • 一次和无限次之间,尽可能多次,按需回馈(贪婪)+
      • 介于“a”和“z”之间的字符a-z
      • 介于“0”和“9”之间的字符0-9
      • 一个人物\-
      • 一个人物\_
    • 匹配字符“.” 字面上地\.
    • 匹配下面列表中的单个字符[a-z0-9\-\_]{2,}
      • 在 2 次和无限次之间,尽可能多次,根据需要回馈(贪婪){2,}
      • 介于“a”和“z”之间的字符a-z
      • 介于“0”和“9”之间的字符0-9
      • 一个人物\-
      • 一个人物\_
    • 断言字符串末尾的位置(或字符串末尾的换行符之前,如果有的话)$
  2. (THEN)如果测试成功,匹配下面的正则表达式.+
    • 匹配任何不是换行符的单个字符.+
    • 一次和无限次之间,尽可能多次,按需回馈(贪婪)+
  3. (ELSE)如果测试失败,如果测试成功,匹配下面的正则表达式[a-z0-9\-\_]+\.[a-z0-9\-\_]{2,}$
    • 匹配下面列表中的单个字符[a-z0-9\-\_]+
    • 一次和无限次之间,尽可能多次,按需回馈(贪婪)+
    • 介于“a”和“z”之间的字符a-z
    • 介于“0”和“9”之间的字符0-9
    • 一个人物\-
    • 一个人物\_
    • 匹配字符“.” 字面上地\.
    • 匹配下面列表中的单个字符[a-z0-9\-\_]{2,}
    • 在 2 次和无限次之间,尽可能多次,根据需要回馈(贪婪){2,}
    • 介于“a”和“z”之间的字符a-z
    • 介于“0”和“9”之间的字符0-9
    • 一个人物\-
    • 一个人物\_
  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
于 2013-03-19T12:31:51.907 回答
2

您有多种方法来管理此任务。在 apache httpd 网站上什至有一个专门的文档页面。

这导致了几种方法:

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

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

于 2013-03-13T12:46:38.137 回答
1

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

于 2013-03-13T09:44:57.187 回答