使用 Apache 将 URL 路径视为虚拟主机

Posted

技术标签:

【中文标题】使用 Apache 将 URL 路径视为虚拟主机【英文标题】:Treat URL path as virtual host using Apache 【发布时间】:2011-10-17 06:57:41 【问题描述】:

问题是我只有一个域名,需要在其上运行三种不同的产品(其中两种基于 php,一种基于 Python)。所以我需要将 URL 中的路径视为不同的虚拟主机;即:

www.domain.com/first_URL/
www.domain.com/second_URL/
www.domain.com/third_URL/

第一个到第三个将充当单独的虚拟主机。

我该怎么做?

【问题讨论】:

【参考方案1】:

这可以通过使用 Alias 或 AliasMatch 指令来实现:

Alias /first_url/ /var/www/first_url_resources

更多详情请见Apache Module mod_alias

【讨论】:

旧答案甚至更旧的问题,我知道,但这正是我所追求的单行解决方案类型。当您不确定要查找的内容的语法或上下文时,搜索某些内容并不容易。谢谢! 还有一点需要注意:Alias /url /path/to/dir 指令后面可以跟 <Directory /path/to/dir/> 指令以允许覆盖该特定目录。 这并没有回答问题,因为Alias 指令不会创建虚拟主机。因此,所有只能在虚拟主机中使用的指令(例如SuexecUserGroup)都不能与此Alias 解决方法一起使用。【参考方案2】:

Apache 中的“虚拟主机”仅适用于域名,而不适用于部分路径。你无法实现你想要的。

【讨论】:

大多数人认为虚拟主机设置在最终用户功能方面类似于反向代理。这个问题可以这样解释。 Apache可以做反向代理。【参考方案3】:

这个例子解释了如何为每个目录分配不同的 PHP 版本。它还可以通过在特定端口上以fast_cgi 的身份运行 Python 解释器来添加 Python 支持。

出于示例的目的,我假设每个 PHP 版本都有一个单独的目录,并且根据运行它们的 PHP 版本命名,但这可以调整。

mkdir /home/user/www
mkdir /home/user/www/5.6.5
mkdir /home/user/www/7.0.2
mkdir /home/user/www/7.0.4
mkdir /home/user/www/7.0.6

创建指向应由不同 PHP 版本处理的目录的符号链接:

sudo ln -s /home/user/www/7.0.2/ /var/www/html/7.0.2
sudo ln -s /home/user/www/7.0.4/ /var/www/html/7.0.4
sudo ln -s /home/user/www/7.0.6/ /var/www/html/7.0.6

然后将以下行添加到默认虚拟主机*:80中的/etc/apache2/sites-enabled/000-default.conf中

(根据您的需要,您可以在此处为需要 Python 的网站多设置一个 FastCGI 处理程序)。我假设 PHP 5.6.5 在端口 9999 上运行,7.0.2 在端口 9998 上运行,等等。

DirectoryIndex index.html index.php
ProxyPassMatch ^/5.6.5/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9999/var/www/html/
ProxyPassMatch ^/7.0.2/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9998/var/www/html/
ProxyPassMatch ^/7.0.4/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9997/var/www/html/
ProxyPassMatch ^/7.0.6/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9996/var/www/html/

假设您的服务器由example.com 指向,您可以在以下位置对其进行测试:

http://example.com/5.6.5/
http://example.com/7.0.2/
http://example.com/7.0.4/
http://example.com/7.0.6/

【讨论】:

这个例子看起来过于复杂了。【参考方案4】:

您可能想对 apache-config 指令做一些事情,因为您需要一个虚拟主机解决方案。 Apache 只能使用 virtualHosts 作为实际域,如 cweiske explained。

这种情况下的解决方案是在您正在使用的子目录中使用.htaccess 文件,或者在您当前的(虚拟)主机配置中设置一个<Directory "/web/root/subdir">..</Directory> 块。

如果您本身想将它们作为 VirtualHosts ('app1.domain.org') 运行,您也可以选择将它们托管在不同的子域上。

【讨论】:

嗯,问题是我只有 1 个域,无法添加更多子域。我需要在上面运行 3 个不同的应用程序。目录指令不是一个选项,因为我不能在其中放置 WSGI 初始化脚本。 @Ruslan:在没有任何 WSGI 经验的情况下,快速浏览文档表明您可以在 WSGIScriptAlias /app1 /usr/local/wsgi/scripts/app1.wsgi 后跟 WSGIScriptAlias /app2 /usr/local/wsgi/scripts/app2.wsgi 等。不确定这是否足够? 在常规虚拟主机配置中? (不是上面建议的目录块之一)。 scriptAlias 可以针对不同的路径多次调用。 抱歉,我打错了

以上是关于使用 Apache 将 URL 路径视为虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章

如何把物理路径转换成虚拟路径

找不到 Ubuntu Apache2 本地虚拟主机 url

如何防止 apache 在 URL 路径中使用单斜杠减少双斜杠?

http进阶

Apache virtualHost 忽略或指向默认的

如何将 URL 捕获为变量并在 apache 配置文件中使用它