关于有点奇怪的 VirtualHost 的奇怪问题

问题描述

我有一个奇怪的问题,关于服务器的一个有点奇怪的 VirtualHost 设置。

我当前的设置:

    <VirtualHost *:443>
        DocumentRoot "/var/www/html/userA/standard/"
        ServerName "server.com"
        ServerAlias *.*.sub.server.com
        Include /home/user.file.lc
        Include /home/common.lc
    </VirtualHost>

在 common.lc 中,我有以下设置:

    RewriteEngine on
    
    RewriteCond %{DOCUMENT_ROOT}/$1 -f [OR]
    RewriteCond %{DOCUMENT_ROOT}/$1 -d
    RewriteRule (.*) - [S=2]
    RewriteRule (.*) /index.html?q=$1 [L]
    
    <Directory "/var/www">
        Header always set Access-Control-Allow-Origin "*"
        Header always set Access-Control-Allow-Methods "POST,GET,OPTIONS,DELETE,PUT"
        Header always set Access-Control-Allow-Headers "x-requested-with,Content-Type,origin,authorization,accept,client-security-token"
        Header always set Access-Control-Expose-Headers "Content-Security-Policy,Location"
        Header always set Access-Control-Max-Age "600"

        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
    </Directory>

在 user.file.lc 中我有以下设置:

   VirtualDocumentRoot "/var/www/html/%1/standard/"

该设置允许多个同事在 httpd 中使用相同的设置,只是文件结构不同。直到今天,我们发现了一个奇怪的问题。

让我再详细说明一下:

如果您访问:

userA.test.server.com -> 一切正常。

userB.test.server.com -> 一切正常。

但是如果您访问: userB.test.server.com/somepage -> 解决方案响应来自 userA 的 /index.html,但其他一切似乎都是正确的。图片、css、JS 等都是从 userB 加载的。所有资产都被称为根(例如/dist/file/style.css)。其他静态文件似乎也正确加载。

似乎 index.html 仅在没有指定其他参数时才从 userB 加载。

有人知道为什么会这样吗?

解决方法

原因

userB.test.server.com/somepage -> (some other resource "/index.html from userA")

是因为你的重写条件是这样的。

RewriteCond %{DOCUMENT_ROOT}/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule (.*) - [S=2]
RewriteRule (.*) /index.html?q=$1 [L]

它总是重定向到用户 A 主页的原因也是因为您指定将 DocumentRoot 设置为用户 A 的目录

DocumentRoot "/var/www/html/userA/standard/"
                             ^ (there)

我建议您删除此行

DocumentRoot "/var/www/html/userA/standard/"

因为您已经指定了 VirtualDocumentRoot

我也建议你改变

'userA' to 'usera'
and 
'userB' to 'userb'

原因是域名不区分大小写。确实,主机名(有时)区分大小写,以避免混淆,只需将它们全部设为小写即可。 此外,我在自己的 Apache 2.2.46 版本(在 linux 4.9.117+ armv7l Android 上)上对其进行了测试,发现所有大写字符都转换为主机名中的小写形式。