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

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

文档根目录是一个空文件夹。应用程序位于文档根目录之外。 我们正在尝试使用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

这是httpd.conf中的相关设置

DocumentRoot /usr/local/var/www
<Directory "/usr/local/var/www">
    AllowOverride None
    Require all granted
</Directory>
Alias "/app1" "/usr/local/var/app1"
Alias "/app2" "/usr/local/var/app2"

<VirtualHost *:80>
   # rewriting rules to make the routing work
   # There is only one vhost so it can actually be removed
</VirtualHost>

当我们访问https://sub.domain.com/app1时,我们希望转到app1 当我们访问https://sub.domain.com/app1.stg时,我们希望转到app1.stg

应用程序是用PHP编写的。这种服务器配置意味着我们必须在路由和重写规则中包括“应用程序的路径”,并在所有资源引用中使用“完整的绝对路径”。 例如,一条路线看起来像

$router->map("GET","/app1/action",SomeController);

css引用将是:(即使给出了相对路径,其行为也类似于DocRoot的相对路径(前面带有“ /”。您可以在此详细的post中看到它)

<link href="app1/public/css/style.css" type="text/css" rel="stylesheet"/>

这些内容足以使两个应用程序都能正常工作,但暂存版本将无法正常工作,因为它包含完全相同的代码副本(按预期的方式进行,以便在暂存环境中进行测试,然后推送到生产环境)。 如果我希望两个版本均能工作,则必须动态编码路径,即使用CONTEXT_DOCUMENT_ROOT或其他服务器变量来确定其所在的应用程序版本,并具有两个路由副本,一个以app1开头,另一个以app1.stg开头。 。对于每个版本,我还必须有单独的重写规则。

问题

应用服务器设置限制(一个域名,按照我所描述的方式区分应用程序,等等。),是否可以仅使用相对路径,仅将路径写入应用程序本身?像这样:

<link href="css/style.css" type="text/css" rel="stylesheet"/>

$router->map("GET","/action",SomeController);

换句话说,我必须在约束范围内更改服务器设置,以便可以以某种方式编写应用程序而不必关心服务器的设置。

我知道一种方法是为每个应用程序/版本使用不同的端口,但是显然服务器管理员不喜欢这个主意。

我已将问题分解为this question中的步骤。它很长,但是如果您愿意遵循,它应该提供更多的细节。


如果问题不够清楚,则per-user directory看起来很像我想要实现的目标。但是,我希望使用应用程序目录代替用户目录,而不是用户目录。当然,我从来没有使用过每个用户的目录,所以我不知道它是否确实按照我认为的方式运行。


所以我知道我们可以在/ etc / hosts中将多个主机名映射到一个IP地址。我可以仅使用该主机名作为apache config中的ServerName,并通过键入该主机名在浏览器中进行访问吗?该网站仅供内部使用,因此只能在公司网络内访问。

在/ etc / hosts中:

123.45.67.89 app1.team-server-name app2.team-server-name

在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>
dosoo 回答:多个应用程序,同一域下的应用程序的多个版本。如何配置apache服务器,路由和相对路径以使其正常工作?

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

我会选择与您当前尝试的方法不同的方法。不要将每个应用程序都放在一个文件夹之外,而是将每个应用程序设置为基于域的虚拟主机。使用诸如app1.local之类的名称作为主机名,并确保将条目添加到127.0.0.1下的/ etc / hosts文件中。确保这些虚拟主机的listen指令位于环回(127.0.0.1:80)上。这些应用程序中的每个应用程序都应像安装在其自己服务器的文档根目录下一样运行。所有CSS均应相对于/位于'css / style.css'处。

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

我已经很长时间没有使用Apache 2.x了,但是概念与nginx相同。

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

此方法的最大问题是,被代理的应用程序要么需要在各处使用相对路径,要么需要在URL之前添加某种可配置的前缀。大多数框架将支持prefix选项。例如:https://laravel.com/docs/5.6/urls此前缀也可以用于加载资产(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>

所有相对路径都可以正常重写。 路由和请求都必须以应用名称开头。

$router->map("GET","/app1/hello2",SomeController);
// navigation bar. URI for another tab:
<li><a href="/app1/hello2">Hello 2</a></li>

如果我们想拥有该应用程序的多个版本,主要要做的就是知道我们所处的版本,以便该应用程序可以发送正确的请求uri。这可以通过检查REQUEST_URI并记住调用index.php时正在调用哪个版本来完成。然后在请求中(例如导航src),将其附加在操作之前。

有多种方法可以做到这一点,例如用php编写html模板,因此您可以访问php变量。我使用了树枝,因此可以将值从php传递到树枝模板。但是我仍然不喜欢在静态代码中包含所有这些内容,因此我决定摆脱暂存版本。

如果项目足够严重,需要一个暂存版本,那么应该提供一个更合适的环境。

本文链接:https://www.f2er.com/3134760.html

大家都在问