.htaccess子域名重定向到子目录及HTTPS规则配置问题
解决es.example.com重定向到www.example.com/ES的问题
看起来你的规则逻辑本身是对的,但可能是浏览器缓存了旧的301重定向或者规则的细节需要调整。让我们一步步排查和修复:
问题分析
你已经添加了处理es.example.com的重定向规则并加上了L标志(终止后续规则),理论上应该优先执行这条规则,但出现异常的常见原因:
- 301永久重定向的浏览器缓存:之前错误的规则被浏览器缓存,导致新规则不生效
- 规则缺少忽略大小写的标志,可能导致某些边缘情况不匹配
修复方案
1. 调整重定向规则(添加NC标志)
修改第一条重写规则,加上NC(忽略大小写)标志,确保无论请求的域名是大写还是小写都能匹配,同时保留L和R=301:
RewriteCond %{HTTP_HOST} ^es\.example\.com$ [NC] RewriteRule ^(.*)$ https://www.example.com/ES/$1 [R=301,L]
2. 强制清除浏览器缓存
因为301是永久重定向,浏览器会长期缓存这个响应。你需要:
- 使用浏览器的隐私/无痕模式测试新规则
- 手动清除浏览器的缓存(快捷键通常是
Ctrl+Shift+Delete) - 或者临时把
R=301改成R=302(临时重定向)测试,确认生效后再改回301
3. 完整的修正后.htaccess代码
这里是整合后的完整代码,确保重定向规则的顺序和参数正确:
AddType application/x-httpd-php .php .htm .html AddDefaultCharset UTF-8 RewriteEngine On # 处理es.example.com重定向到www.example.com/ES RewriteCond %{HTTP_HOST} ^es\.example\.com$ [NC] RewriteRule ^(.*)$ https://www.example.com/ES/$1 [R=301,L] # 强制HTTPS和www前缀 RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC] RewriteCond %{HTTP_HOST} !^local RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301] <IfModule mod_expires.c> # Enable expirations ExpiresActive On # Default directive ExpiresDefault "access plus 1 month" # My favicon ExpiresByType image/x-icon "access plus 1 year" # Images ExpiresByType image/gif "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType image/svg "access plus 1 month" ExpiresByType image/jpg "access plus 1 month" ExpiresByType image/jpeg "access plus 1 month" # Flash ExpiresByType application/x-shockwave-flash "access plus 1 month" # CSS ExpiresByType text/css "access plus 1 week" # Javascript ExpiresByType application/javascript "access plus 1 week" </IfModule> <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)(\.gz)?$"> Header unset ETag FileETag None </FilesMatch> <IfModule mod_headers.c> <FilesMatch ".(js|css|xml|gz|html|svg|swf)$"> Header append Vary: Accept-Encoding </FilesMatch> </IfModule> <IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE image/x-icon AddOutputFilterByType DEFLATE image/svg+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/x-font AddOutputFilterByType DEFLATE application/x-font-truetype AddOutputFilterByType DEFLATE application/x-font-ttf AddOutputFilterByType DEFLATE application/x-font-otf AddOutputFilterByType DEFLATE application/x-font-opentype AddOutputFilterByType DEFLATE application/vnd.ms-fontobject AddOutputFilterByType DEFLATE application/x-shockwave-flash AddOutputFilterByType DEFLATE font/ttf AddOutputFilterByType DEFLATE font/otf AddOutputFilterByType DEFLATE font/opentype # For Olders Browsers Which Can't Handle Compression BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html </IfModule> ErrorDocument 400 /400.html ErrorDocument 401 /401.html ErrorDocument 403 /403.html ErrorDocument 404 /404.html ErrorDocument 500 /500.html
测试步骤
- 替换你的.htaccess文件为上述代码
- 打开浏览器无痕模式,访问
es.example.com(或带路径的页面,比如es.example.com/about) - 确认是否正确跳转到
https://www.example.com/ES/about
如果还是有问题,可以检查服务器是否启用了mod_rewrite模块,或者查看服务器的访问日志,确认请求是否被正确匹配到第一条规则。
内容的提问来源于stack exchange,提问作者Bangkokian
相关产品推荐
相关产品推荐

