.htaccess失效:访问子域名archive.example.com时自动跳转至主域名
这种跳转问题我之前帮朋友排查过好几次,大概率是网站内部的URL配置、服务器重写规则或者硬编码URL在搞鬼,咱们一步步来解决:
1. 检查网站程序的基础URL配置
绝大多数CMS(比如WordPress、Drupal)或者自定义开发的网站,都会有一个「站点基础URL」的配置项。之前你的网站部署在http://www.example.com/archive,现在迁移到子域名后,这个配置可能没同步更新,导致程序自动生成跳转链接。
举个WordPress的例子,你可以直接修改wp-config.php文件,添加或更新以下配置:
define('WP_HOME', 'http://archive.example.com'); define('WP_SITEURL', 'http://archive.example.com');
如果是其他CMS或者自定义程序,找到对应的配置文件(比如config.php、settings.php),查找类似BASE_URL、SITE_URL的变量,把值改成http://archive.example.com。
2. 排查服务器重写规则(.htaccess/Nginx配置)
如果你的服务器用的是Apache,检查子域名根目录下的.htaccess文件,看看有没有强制跳转到主域名的规则。比如类似下面的代码就要删掉或者修改:
# 错误的跳转规则,要移除 RewriteRule ^(.*)$ http://www.example.com/archive/$1 [R=301,L]
如果是Nginx服务器,打开子域名对应的server配置块,检查是否存在rewrite指令把请求导向主域名。正确的子域名配置应该是直接指向archive文件夹,比如:
server { listen 80; server_name archive.example.com; root /path/to/your/archive/folder; index index.php index.html; # 其他必要的规则,比如PHP解析 location ~ \.php$ { fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
3. 批量替换页面内的硬编码URL
有些页面可能直接写死了主域名的URL(比如<a href="http://www.example.com/archive/some_page">),这种情况需要批量替换。你可以用服务器的命令行工具快速处理:
Linux系统下用sed命令(替换所有PHP文件里的旧URL):
sed -i 's/http:\/\/www.example.com\/archive/http:\/\/archive.example.com/g' /path/to/archive/files/*.php
如果有HTML、JS、CSS文件,把*.php换成对应的后缀即可,或者用*.*匹配所有文件(注意备份后再操作)。
4. 清除缓存
最后别忘了清除缓存,包括:
- 浏览器端强制刷新(Ctrl+F5),避免缓存旧的跳转规则
- 服务器端缓存(比如OPcache、Redis),可以重启PHP服务或者重置缓存
- 如果用了CDN,登录CDN后台清除对应子域名的缓存
按照上面的步骤排查,基本就能解决跳转问题,让访问始终停留在archive.example.com域名上。
内容的提问来源于stack exchange,提问作者Miŋ Q Kim

