【问题标题】:Weird question regarding a bit weird VirtualHost关于有点奇怪的 VirtualHost 的奇怪问题
【发布时间】:2021-08-27 16:50:55
【问题描述】:

关于服务器的虚拟主机设置有点奇怪,我有一个奇怪的问题。

我目前的设置:

    <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 加载。

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

【问题讨论】:

  • 可能是因为您已将DocumentRoot 设置为指向/var/www/html/userA/standard/,所以如果您在哪里定义了服务器且未定义路由,会去哪里?

标签: apache mod-rewrite virtualhost


【解决方案1】:

原因

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'

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

【讨论】:

  • 嗨。我不明白。 rewriteCond 正在工作,它们响应直接放在不同文件夹中的文件。但是 RewriteRule /Index.html?q=$ 没有。我猜它应该响应whatever.com/abc -> 不管什么.com/index.html?q=abc。但相反,它使用原始 DocumentRoot 进行响应。当它被删除时(并且在修复了 conds 上的故障之后)它仍然无法正常工作。它让我发疯......
猜你喜欢
  • 2019-08-28
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多