我的服务器上的子子域名有问题(Debian 上的 Apache 2.2),我的 /etc/apache2/sites-available 中有此行:
重写规则 ^(([^./]+.)?site.com)/(.*) /www/site.com/www/root/$3 [L]
此行应该意味着每个子域或子子域(等等)都必须重定向到上面的目录,在这个目录中我有一个获取请求的 .htaccess 文件。
当我输入 site.com 和 subdomain.site.com 时,一切都运行正常,但当我尝试使用 m.subdomain.site.com 等子子域(甚至 www.subdomain.site.com)时,问题就出现了,它给出了 400 Bad Request Error 消息。我尝试重定向 www.subdomain.site.com .htaccess 文件,但没有结果(似乎甚至没有检查),我认为错误出在上面的重写规则中,它没有正确地将请求重定向到目录。
有人可以提示一下问题出在哪里吗?
编辑:这是 sites-available 中的整个 vhost 配置:
NameVirtualHost 1.2.3.4:80
NameVirtualHost 1.2.3.4:443
<VirtualHost 1.2.3.4:80>
ServerName mysite.com
ServerAdmin [email protected]
DocumentRoot /www
<Directory />
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
RewriteEngine On
RewriteMap lowercase int:tolower
RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]
RewriteRule ^(([^\.\/]+\.)?othersite1\.com)/(.*) /www/othersite1.com/www/root/$3 [L]
RewriteRule ^(([^\.\/]+\.)?othersite2\.com)/(.*) /www/othersite2.com/www/root/$3 [L]
RewriteRule ^(([^\.\/]+\.)?mysite.com)/(.*) /www/mysite.com/www/root/$3 [L]
RewriteRule ^(([^\.\/]+\.)?othersite3\.com)/(.*) /www/othersite3.com/www/root/$3 [L]
RewriteRule ^(([^\.\/]+\.)?othersite4\.com)/(.*) /www/othersite4.com/www/root/$3 [L]
RewriteRule ^(([^\.\/]+\.)?[^\.\/]+\.[^\.\/]+)/(.*) /www/mysite.com/www/root/$3 [L]
# RewriteMap lowercase int:tolower
# RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]
# RewriteRule ^([^\.\/]+\.[^\.\/]+)/(.*) /www/$1/www/root/$2
# RewriteRule ^www\.([^\/]+)\.([^\.\/]+\.[^\.\/]+)/(.*) /www/$2/www/root/$3
# RewriteRule ^([^\/]+)\.([^\.\/]+\.[^\.\/]+)/(.*) /www/$2/www/root/$3
</VirtualHost>
<VirtualHost 1.2.3.4:443>
ServerName secure.mysite.com
ServerAdmin [email protected]
DocumentRoot /www
<Directory />
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
SSLEngine on
SSLCertificateFile /etc/ssl/certs/mysite/secure.mysite.com.crt
SSLCertificateKeyFile /etc/ssl/certs/mysite/secure.mysite.com.key
SSLCertificateChainFile /etc/ssl/certs/mysite/gd_bundle.crt
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
RewriteEngine On
RewriteMap lowercase int:tolower
RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]
RewriteRule ^([^\.\/]+\.[^\.\/]+)/(.*) /www/$1/www/root/$2
RewriteRule ^www\.([^\/]+)\.([^\.\/]+\.[^\.\/]+)/(.*) /www/$2/www/root/$3
RewriteRule ^([^\/]+)\.([^\.\/]+\.[^\.\/]+)/(.*) /www/$2/www/root/$3
</VirtualHost>
有多个网站位于不同的子域上,每个网站都有位于 m.subdomain.mysite.com 的移动版本
答案1
好的,所以我对您的案例做了一些测试,这是工作结果(我不认为您此时使用的当前 RewriteRules 是正确的 - 这些如上所示)。
以下是我测试过的解决方案。示例 1 显示了重写第一级子域名(例如 subdomain.domain.com),示例 2 显示了重写第二级子域名(例如 subdomain.subdomain.domain.com)。
以下是示例:示例 1:
1. RewriteEngine On
2. RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.com
3. RewriteCond /var/www/html/%1 -d
4. RewriteRule ^(.*) /%1/$1 [L]
- 启用重写引擎
- 捕获一级子域名
- 检查目录(子域名)是否存在
- 将请求的文件重写到目录(给定的示例使用相对路径)
示例 2:
1. RewriteEngine On
2. RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.domain\.com
3. RewriteCond /var/www/html/%1/%2 -d
4. RewriteRule ^(.*) /%1/%2/$1 [L]
- 启用重写引擎
- 捕获第一/第二级子域名
- 检查目录(子域名)是否存在
- 将请求的文件重写到目录(给定的示例使用相对路径)
以下是上面给出的例子的结果:
例 1 - 点击 URL test.domain.com/index.php --> 重定向至 --> /var/www/html/test/index.php
例 2 - 点击 URL 1.2.domain.com/index.php --> 重定向至 --> /var/www/html/1/2/index.php
我假设虚拟主机的文档根目录配置为 - /var/www/html
答案2
您确定您的 Apache 已正确配置以服务所谓的 sub 子域吗?我的意思是,这些子域是预先配置的吗,例如 (sub-sub1、sub-sbu2 等有限数量,在 vhost 配置中配置),还是这些是随机的子域?如果它们是随机的,我想您在 vhost 的配置中有一些通配符?
--------==============----------
好的,尝试添加 ServerAlias *.mysite.com ServerAlias *.othersite1.com ....... ServerAlias *.othersite[N].com
在您的 vhost 配置中
答案3
这听起来像是一份工作mod_vhost_alias或者更简单的分离基于名称的虚拟主机适当的服务器别名指令比你采取的更易于维护mod_rewrite。