【问题标题】:Apache Differentiate domains by VirtualhostApache 通过 Virtualhost 区分域
【发布时间】:2021-03-15 23:11:41
【问题描述】:

我需要从一个文件夹中提供多个域,并进行较小的品牌/重新换肤更改。为了避免维护十几个重复的代码库,我想为每个代码库设置一个环境变量。我需要一种不能被“在浏览器中”篡改的安全方式,所以我试图在提供代码之前设置一些东西。

我已经在我的服务器上设置了站点,我计划为每个站点使用 SetEnv SITE_CODE 来确定正在服务的站点,我的 PHP 代码将使用 get getenv('SITE_CODE'); 来确定要显示的皮肤。

但是,这似乎行不通,因为我获得了所有网站的最后一个网站代码。有什么我做错了或更好的方法吗?

<VirtualHost *:80>
    ServerAdmin info@site1.com
    ServerName site1.com
    ServerAlias site1.com www.site1.com
    DocumentRoot /var/www/mainsite/
    ErrorLog /var/www/site1.com/logs/error.log
    CustomLog /var/www/site1.com/logs/access.log combined
</VirtualHost>

SetEnv SITE_CODE site1

<VirtualHost *:80>
    ServerAdmin info@site2.com
    ServerName site2.com
    ServerAlias site2.com www.site2.com
    DocumentRoot /var/www/mainsite/
    ErrorLog /var/www/site2.com/logs/error.log
    CustomLog /var/www/site2.com/logs/access.log combined
</VirtualHost>

SetEnv SITE_CODE site2

【问题讨论】:

  • 修正错别字....

标签: php linux apache global-variables


【解决方案1】:

为 Apache 设置的环境变量将影响 Apache 用户的环境,而不是特定的最终用户会话,这就是为什么它不能可靠地用于您的目的。

如果是我,我会做以下两件事之一:

  1. 通过检查 $_SERVER['SERVER_NAME'] 直接检查请求的域
  2. 检查该值,然后在第一次请求时设置一个会话变量(即,如果该变量尚未为当前会话设置)。如果出于某种原因这很重要,这将无法直接被篡改。

【讨论】:

    【解决方案2】:

    您基本上可以保留 VirtualHostConfig 并在您的 webroot 文件夹中的 .htaccess 文件中使用 SetEnvIf。

    SetEnvIf Host "my.site1.com" SITE_CODE=Site1

    ...

    SetEnvIf Host "my.site2.com" SITE_CODE=Site2 等等。

    可以在此处找到有关相应 Apache 指令和使用的模块的更深入的手册:https://httpd.apache.org/docs/current/mod/mod_setenvif.html

    正如这个答案所述:https://stackoverflow.com/a/4139899/8103283 例如,如果您无法使用模块 mod_setenvif,则 mod_rewrite 也可以解决问题。

    【讨论】:

      猜你喜欢
      • 2015-03-04
      • 2017-06-03
      • 2012-11-14
      • 2017-01-14
      • 2020-04-09
      • 2019-04-13
      • 1970-01-01
      • 2019-01-15
      • 2015-10-16
      相关资源
      最近更新 更多