【问题标题】:Apache2 - Using a lowercase subdomain to serve an uppercase folderApache2 - 使用小写子域为大写文件夹提供服务
【发布时间】:2025-11-23 00:00:01
【问题描述】:

当前托管的网站使用以下结构 test.mysite.com/{site} 然后服务 /var/www/test/{site}

我一直在尝试创建一个可以匹配多个子域并为 /var/www/test/ 下的文件夹提供服务的虚拟主机。网址看起来像 {site}.test.mysite.com

我尝试了几种方法,一种使用虚拟文档根:

<VirtualHost *:80>
    ServerName test.mysite.com
    ServerAlias *.test.mysite.com

    VirtualDocumentRoot /var/www/test/%1/
</VirtualHost>

这很好用,只是 /var/www/test/ 下的文件夹是大写的,我似乎无法将 %1 转换为大写。

另一种方法是使用 apache 网站上指定的 mod rewrite

<VirtualHost *:80>
    ServerName test.mysite.com
    ServerAlias *.test.mysite.com

    RewriteEngine on
    RewriteMap upper int:toupper
    RewriteMap lowercase int:tolower

    RewriteCond ${lowercase:%{SERVER_NAME}} ^[a-z0-9-]+\.test\.mysite\.com$           
    RewriteRule ^([a-z0-9]+)\.test\.mysite\.com/$ /var/www/test/${upper:$1}/ 
</VirtualHost>

但它似乎从未真正重写,只是继续提供默认的 apache 文档根目录。

由于其他依赖项,我不希望将所有文件夹的名称更改为小写。还有其他选择吗?

【问题讨论】:

  • 配置apache忽略大小写?
  • 你试过符号链接吗?
  • 创建符号链接确实可以解决使用 VirtualDocumentRoot 时的问题,但这不是一个长期的解决方案,因为底层文件夹结构会定期更改。必须一直手动添加/删除符号链接不是很实用。
  • 有完全相同的问题。试过 "CheckCaseOnly On" "/var/www/test/${upper:$1}" 似乎没有任何效果......

标签: apache mod-rewrite virtualhost


【解决方案1】:

你的规则是错误的:这里的 RewriteRule 只适用于不包括主机的 URL 的完整路径。试试:

RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.test\.mysite\.com$           
RewriteRule .* /var/www/test/${upper:%1}$0 [L]

【讨论】:

  • 这是正确的,但是 op 需要设置文档根目录,这将导致像 foo.test.mysite.com/var/www/test/FOO 这样的重定向,我认为这不是预期的结果
  • 我试过了,但是这会创建一个重定向到 something.test.mysite.com/index.html/index.html/index.html 等。
最近更新 更多