同一域名下多WordPress站点部署的重定向问题排查
我之前帮客户处理过几乎一模一样的问题,这种不带末尾斜杠就丢了目录前斜杠的情况,十有八九是根目录和子文件夹的.htaccess规则冲突,或者子站点的配置没到位。下面给你几个靠谱的解决步骤:
问题原因分析
当用户访问不带末尾斜杠的子文件夹URL时,服务器会优先尝试用根目录的.htaccess规则处理。如果根目录规则没有排除子文件夹请求,或者子文件夹的WordPress配置(.htaccess+后台URL)不正确,就会导致重定向时丢失子文件夹前的斜杠,出现domainname.comsub-folder-1这种错误地址。
分步解决方案
1. 修正子文件夹的.htaccess配置
每个子文件夹的WordPress站点,必须正确设置RewriteBase,让服务器明确这个站点的根路径是子文件夹。打开/sub-folder-1/.htaccess,确保内容如下:
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /sub-folder-1/ # 必须匹配子文件夹路径,带末尾斜杠 RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /sub-folder-1/index.php [L] # 路径要完整对应子文件夹 </IfModule> # END WordPress
其他子文件夹站点以此类推,修改对应的RewriteBase和RewriteRule路径。
2. 调整根目录.htaccess,排除子文件夹请求
根目录的WordPress规则会默认处理所有请求,我们需要让它跳过子文件夹的站点,交给子文件夹自己的.htaccess处理。修改根目录的.htaccess:
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # 添加排除规则,列出所有子文件夹站点的路径 RewriteCond %{REQUEST_URI} !^/sub-folder-1/ RewriteCond %{REQUEST_URI} !^/sub-folder-2/ # 有多少个子站点就加多少条 RewriteRule ^index\.php$ - [L] # 后续重写规则前同样加上排除条件 RewriteCond %{REQUEST_URI} !^/sub-folder-1/ RewriteCond %{REQUEST_URI} !^/sub-folder-2/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
这样根目录的规则就不会干扰子文件夹的请求了。
3. 确认WordPress后台站点URL设置
登录每个子文件夹的WordPress后台,进入设置 -> 常规:
- 确保“站点地址(URL)”设置为
https://domainname.com/sub-folder-1/(必须带末尾斜杠) - “WordPress地址(URL)”如果是子文件夹内的wp目录,也对应设置正确(一般和站点地址一致,除非你单独分离了wp核心)
4. 确保服务器开启DirectorySlash
默认服务器的mod_dir模块会自动给不带斜杠的目录请求添加斜杠,如果这个功能被关闭了也会导致问题。可以在根目录或子文件夹的.htaccess顶部添加:
DirectorySlash On
(大部分服务器默认是开启的,这一步作为兜底检查)
验证方案
修改完成后,清除浏览器缓存,访问domainname.com/sub-folder-1(不带斜杠),应该会自动重定向到domainname.com/sub-folder-1/,不会出现丢失斜杠的情况。
内容的提问来源于stack exchange,提问作者Trevor Geene

