如何用.htaccess实现子域名无URL跳转的多目录映射?
解决方案
完全可以通过production目录下的.htaccess文件实现需求,无需额外在tool目录配置。以下是修正后的配置和思路:
问题分析
- 原根目录配置导致URL显示
/wordpress,是因为规则触发了外部跳转(而非内部重写),通常是mod_dir的DirectorySlash机制在重写后自动补全斜杠并跳转,或者规则写法未明确内部重写逻辑。 tool目录下的配置无效,是因为%{DOCUMENT_ROOT}指向本地文件系统路径,RewriteRule的替换目标如果用本地路径,Apache无法正确处理为URL重写,必须使用相对路径或基于网站根的路径。
修正后的.htaccess配置(放在production目录下)
# 开启重写引擎 RewriteEngine On # 规则1:访问 sub.domain.com/tool 时,内部重写到 subfolder/subfolder1/subfolder2 # 排除实际存在的文件/目录,避免冲突 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^tool/(.*)$ subfolder/subfolder1/subfolder2/$1 [L] # 规则2:访问根目录时,内部重写到 wordpress 目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^$ wordpress/ [L] # 规则3:处理根目录下其他请求,内部重写到 wordpress 对应文件 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ wordpress/$1 [L]
关键说明
- 禁止外部跳转:所有规则使用
[L]flag,替换目标为相对路径(基于production目录),确保是内部重写,URL地址栏不会变化。 - 优先级顺序:
/tool的规则要放在最前面,避免被根目录的wordpress规则覆盖。 - 排除真实文件/目录:通过
RewriteCond %{REQUEST_FILENAME} !-f和!-d,确保实际存在的文件/目录不会被重写,避免冲突。 - 清理无效配置:删除
tool目录下的.htaccess,所有逻辑统一在根目录处理即可。
验证要点
- 访问
sub.domain.com:地址栏保持不变,实际加载production/wordpress下的内容。 - 访问
sub.domain.com/tool:地址栏保持不变,实际加载production/subfolder/subfolder1/subfolder2下的内容。 - 访问
sub.domain.com/tool/test.html:会加载production/subfolder/subfolder1/subfolder2/test.html(如果文件存在)。
内容的提问来源于stack exchange,提问作者th3_sh0w3r
相关产品推荐
相关产品推荐

