Php 多个应用,同一域下应用的多个版本。如何配置apache服务器、路由和相对路径以使其正常工作?

Php 多个应用,同一域下应用的多个版本。如何配置apache服务器、路由和相对路径以使其正常工作?,php,apache,mod-rewrite,deployment,routes,Php,Apache,Mod Rewrite,Deployment,Routes,我的团队的服务器是这样设置的:我们有一个域名,看起来已经是该公司域名的子域了。我们希望在这个域下托管多个应用程序。我们甚至希望服务器上的每个应用都有一个生产版本和登台版本 文档根目录是一个空文件夹。应用程序位于文档根目录之外。 我们试图使用URL路径中的第一个令牌来找出我们试图访问的应用程序,然后以某种方式重定向到它(内部或外部) 这是一个相当于目录组织方式的结构 /usr/local/var/www <- Document Root /usr/local/var/app1 <-

我的团队的服务器是这样设置的:我们有一个域名,看起来已经是该公司域名的子域了。我们希望在这个域下托管多个应用程序。我们甚至希望服务器上的每个应用都有一个生产版本和登台版本

文档根目录是一个空文件夹。应用程序位于文档根目录之外。 我们试图使用URL路径中的第一个令牌来找出我们试图访问的应用程序,然后以某种方式重定向到它(内部或外部)

这是一个相当于目录组织方式的结构

/usr/local/var/www  <- Document Root
/usr/local/var/app1 <- application 1
------------------/public/index.php
------------------/public/css
/usr/local/var/app2 <- application 2
/usr/local/var/app1.stg <- application 1 staging version, code is exactly the same as application1
/usr/local/var/app2.stg <- application 2 staging version, code is exactly the same as application2
css引用将是:(尽管给出了相对路径,但其行为与DocRoot的相对路径一样(前面有“/”)

在httpd.conf中:

<VirtualHost>
    ServerName app1.team-server-name
    DocumentRoot /usr/local/var/app1/public
</VirtualHost>
<VirtualHost>
    ServerName app2.team-server-name
    DocumentRoot /usr/local/var/app2/public
</VirtualHost>

ServerName app1.team-server-name
DocumentRoot/usr/local/var/app1/public
ServerName app2.team-server-name
DocumentRoot/usr/local/var/app2/public

这是一个很长的问题,感谢您提供这么多细节

我会选择一种不同于您目前尝试的方法。不要试图从文件夹中为这些应用程序提供服务,而是将它们设置为基于域的vhost。对主机名使用app1.local之类的内容,并确保将条目添加到127.0.0.1下的/etc/hosts文件中。确保这些vhost的listen指令位于环回上(127.0.0.1:80)。这些应用中的每一个都应该像安装在自己服务器的文档根目录下一样工作。所有CSS都应假定其位于相对于/的“CSS/style.CSS”

现在已在环回上设置了所有应用程序,您可以在从请求中删除/app1前缀后,从公用界面上侦听的vhost设置反向代理,以将所有应用程序位置代理到相应的环回vhost

我已经很长时间没有使用Apache2.x了,但其概念与nginx相同

location  /foo {
  rewrite /foo/(.*) /$1  break;
  proxy_pass         http://app1.local;
  proxy_redirect     off;
  proxy_set_header   Host $host;
}

这种方法的最大问题是,被代理的应用程序或者需要在任何地方使用相对路径,或者需要在URL前面添加某种可配置的前缀。大多数框架都支持前缀选项。例如:这个前缀也可以用于资产(css/js/jpg)加载,但只能从执行PHP的文件中加载。

我最终找到了一个折衷的解决方案

DocumentRoot "/usr/local/var/www"
Alias /app1 /usr/local/var/app1/public

<Directory "/usr/local/var/www">
    RewriteEngine On
    RewriteRule ^/?$ /app1/ [R,L]
    RewriteRule (.*) /app1/$1 [R,L]
</Directory>

<VirtualHost *:80>
    <Directory "/usr/local/var/app1">
        Require all granted
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        # calls index.php (REQUEST_URI is still the same as before)
        RewriteRule ^ index.php [L]
    </Directory>
</VirtualHost>
DocumentRoot”/usr/local/var/www
别名/app1/usr/local/var/app1/public
重新启动发动机
重写规则^/?$/app1/[R,L]
重写规则(.*)/app1/$1[R,L]
要求所有授权
重新启动发动机
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
#调用index.php(请求URI仍然与以前相同)
重写规则^index.php[L]
所有相关路径都可以正常重写。 路由和请求将需要以应用程序名称开头

$router->map("GET", "/app1/hello2", SomeController);
// navigation bar. URI for another tab:
<li><a href="/app1/hello2">Hello 2</a></li>
$router->map(“GET”,“/app1/hello2”,SomeController);
//导航栏。另一个选项卡的URI:
  • 如果我们想要有多个版本的应用程序,主要的事情是要知道我们在哪个版本,以便应用程序可以发送正确的请求uri。这可以通过检查请求URI并记住在调用index.php时调用哪个版本来实现。然后在请求中(例如导航src),将其附加到操作前面

    有不同的方法可以做到这一点,比如用php编写html模板,这样就可以访问php变量。我使用了twig,因此可以从php将值传递给twig模板。但我仍然不喜欢在静态代码中包含所有这些内容,所以我决定放弃登台版本


    如果项目严重到需要登台版本,则应提供更好的合适环境。

    感谢阅读冗长的问题!“每个应用程序都应该像安装在自己服务器的文档根目录下一样工作。”是的,这正是我想要实现的。我想使用多个vhost,每个vhost都有自己的DocRoot和服务器名(这似乎是必需的)。所以问题是我无法更改根目录,因为服务器人员只想拥有一个域,不同的应用程序由url中的第一级标识。我将看一看代理问题,它代表了一种解决方案。在Apache2中设置反向代理的文档如下:您给出的示例是,同一IP地址有不同的主机名。您使用localhost作为示例,但当我在实际服务器中执行此操作时,是否意味着我必须注册不同的域名,至少是不同的子域才能实现此操作?如果是这样的话,我就够不着了。如果使用相同的域名,我不知道如何区分它下托管的不同应用程序。/etc/hosts文件将包含所有这些本地域名。在进入DNS之前,会对其进行检查。您只需编辑此文件并将要用于代理主机的额外域附加到127.0.0.1 localhost行,例如:
    127.0.0.1 localhost app1.local app2.local app1.stg.local app2.stg.local
    。所有这些域都只能从服务器上使用,是的,它们都将解析为127.0.0.1。尝试从其他计算机ping app1.local将不起作用。Apache将在127.0.0.1上接受连接时决定使用哪个基于名称的虚拟主机。从技术上讲,您可以放弃基于名称的虚拟主机,而是使用基于端口的方法,但是,很难记住哪个端口指向哪个主机。例如,您可以使用基于ip:port的vhost来监听127.0.0.1:8080上的app1和127.0.0.1:8081上的app2,而不是基于名称的vhost。hos的好处
    123.45.67.89 app1.team-server-name app2.team-server-name
    
    <VirtualHost>
        ServerName app1.team-server-name
        DocumentRoot /usr/local/var/app1/public
    </VirtualHost>
    <VirtualHost>
        ServerName app2.team-server-name
        DocumentRoot /usr/local/var/app2/public
    </VirtualHost>
    
    location  /foo {
      rewrite /foo/(.*) /$1  break;
      proxy_pass         http://app1.local;
      proxy_redirect     off;
      proxy_set_header   Host $host;
    }
    
    DocumentRoot "/usr/local/var/www"
    Alias /app1 /usr/local/var/app1/public
    
    <Directory "/usr/local/var/www">
        RewriteEngine On
        RewriteRule ^/?$ /app1/ [R,L]
        RewriteRule (.*) /app1/$1 [R,L]
    </Directory>
    
    <VirtualHost *:80>
        <Directory "/usr/local/var/app1">
            Require all granted
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            # calls index.php (REQUEST_URI is still the same as before)
            RewriteRule ^ index.php [L]
        </Directory>
    </VirtualHost>
    
    $router->map("GET", "/app1/hello2", SomeController);
    // navigation bar. URI for another tab:
    <li><a href="/app1/hello2">Hello 2</a></li>