Apache httpd-vhosts.conf和.htacces(XAMPP)中动态虚拟主机的自动化

Ati*_*din 4 apache xampp .htaccess vhosts

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

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

<VirtualHost *>
    DocumentRoot "/path/to/xampp/htdocs/example.com"
    ServerName example.com
    ServerAlias www.example.com
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

我想要实现的是以这样的方式设置环境:我不应该在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
Run Code Online (Sandbox Code Playgroud)

和这样的文件夹结构

/htdocs/
    /example.com/
    /mysite.com/
    /google.com/
    /abc.com/
Run Code Online (Sandbox Code Playgroud)

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

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

所以最终,

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

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

Una*_*rai 5

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

通过*在您通常放置的域名前面放置一个asterix()www

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

    ServerAlias *.example.com

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

所有这些领域:

www.example.com
img.example.com
cdn.example.com
static.img.example.com
Run Code Online (Sandbox Code Playgroud)

将被重定向到/example.com.

说明

基本上,上面的内容是将最后两个字符串分隔为perdiod并将您重定向到新找到的文件夹.


从技术角度来看:

这个正则表达式使用if then|else模式.如果1找到了,那么别管2做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
Run Code Online (Sandbox Code Playgroud)