使用 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 路径视为虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章