Apache通过Virtualhost区分域



我需要为一个文件夹中的多个域提供服务,并对其进行轻微的品牌化/重新绑定更改。为了避免维护十几个重复的代码库,我想为每个代码库设置一个环境变量。我需要一种不可篡改的安全方式;在浏览器中";,所以我试图在提供代码之前设置一些内容。

我在服务器上设置了站点,我计划对每个站点使用SetEnv SITE_CODE来确定服务的站点,我的PHP代码将使用getgetenv('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

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

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

  1. 通过检查$_SERVER['SERVER_NAME']直接检查请求的域
  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也可以做到这一点。

最新更新