如何为除 localhost 之外的所有域提供动态虚拟主机

Posted

技术标签:

【中文标题】如何为除 localhost 之外的所有域提供动态虚拟主机【英文标题】:How to have dynamic virtual hosts for all domains except localhost 【发布时间】:2017-03-04 08:09:47 【问题描述】:

一些背景知识:我一直想设置动态虚拟主机有一段时间了。基本上我只是希望能够将一个文件夹放入我的虚拟主机文件夹中,并让它在没有任何其他配置的情况下工作。我发现在 chrome 中,.localhost 的任何子域的行为都与localhost 相同。这意味着我可以将 .localhost 用作我所有项目的 TLD,并且不必为要添加的每个新虚拟主机编辑我的 HOSTS 文件。

我阅读了https://httpd.apache.org/docs/current/vhosts/mass.html 上的文档,并了解了如何根据主机标头拥有动态虚拟主机。

在阅读了该页面和互联网上的其他资源后,我在httpd-vhosts.conf 文件中提出了以下配置。这使用.localhost 之前的部分来确定文件夹名称。

<VirtualHost *:80>
    ServerAdmin admin@localhost
    
    # Get the server name from the Host header
    UseCanonicalName Off
    
    # Log
    LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
    CustomLog logs/vhost_access.log vcommon
    ErrorLog logs/vhost_error.log
    
    # Match domain name against a folder
    VirtualDocumentRoot "C:/vhosts/%-2+"
    
    <Directory "C:/vhosts/*">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
    </Directory>
</VirtualHost>

因此,通过此设置,我可以在包含我所有 html 文档的 vhosts 文件夹中创建一个新文件夹。因此,例如,如果我创建一个名为 project1 的文件夹,我可以通过转到 http://project1.localhost 来访问该文件夹。

现在我的主要问题是我并不总是需要创建一个新的虚拟主机。我只想创建一个随机的 php 文件并通过转到http://localhost/index.php 来访问它。但是,通过上述配置,仅使用http://localhost 会导致错误。可能是因为VirtualDocumentRoot指令中的模式使用localhost的子域,而我只使用http://localhost时没有子域。

tl;博士:

鉴于上述配置,有没有办法为localhost 设置硬编码虚拟主机,并为localhost 的子域设置动态虚拟主机?

或者,我怎样才能创建一个允许我拥有这个的配置:

http://localhost -----------------> C:/vhosts/
http://project1.localhost --------> C:/vhosts/project1
http://project2.localhost --------> C:/vhosts/project2
http://blog.project2.localhost ---> C:/vhosts/project2/blog

【问题讨论】:

【参考方案1】:

我有一个解决方案,但它只是解决了你的部分问题。

<VirtualHost *:80>
   ServerAdmin admin@localhost
   ServerName  localhost
   DocumentRoot "C:/vhosts/"
</VirtualHost>
<VirtualHost *:80>
   ServerAdmin admin@localhost
   ServerName  longnameyoullneveruse.blabla.localhost
   ServerAlias  *.localhost
   DocumentRoot "C:/vhosts/"
   RewriteEngine On
   RewriteMap lowercase int:tolower
   RewriteCond %HTTP_HOST ^(.*)\.localhost$
   RewriteRule ^(.*)$ "C:/vhosts/$lowercase:%1/$1"
   # you should use all lowercase for subfolders' name
</VirtualHost>

这应该满足您要求的前三行:

http://localhost -----------------> C:/vhosts/
http://project1.localhost --------> C:/vhosts/project1
http://project2.localhost --------> C:/vhosts/project2

【讨论】:

非常感谢。我只需要为http://localhost 添加额外的虚拟主机项。

以上是关于如何为除 localhost 之外的所有域提供动态虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章

从 phpmyadmin 和 mysql 阻止除 localhost 之外的所有用户

DNS,保留除“A”记录之外的所有设置

Pentaho 数据集成 (PDI) 8.3 CE 显示错误“localhost:9051”页面在除浏览存储库之外的所有对话框中都找不到

如何为 ASP.NET Core 2.2 项目中的子域正确启用 CORS?

如何为系统管理员检索除续订帐户以外的所有帐户

如何为 django 模板中的标签创建动态 id