Apache URL重写本身不直接跳转,而是通过User-Agent识别移动端后内部重写到/m/路径或302重定向至m.子域名;内部重写保留地址栏和POST数据,重定向则更新地址栏但丢失POST,适用于页面浏览类请求。

Apache URL 重写本身不直接“跳转”移动端页面,而是根据请求特征(如 User-Agent)判断是否为移动设备,并将请求**内部重写**到对应的移动端资源路径(如 /m/index.php),或**外部重定向**到 m. 子域名(如 https://m.example.com/)。关键区别在于:内部重写不改变地址栏、保留 POST 数据;重定向则让浏览器发起新请求、地址栏更新,适合彻底分离 PC 与移动站点。
识别移动端并内部重写到 /m/ 目录
适用于同一域名下用子目录区分 PC 和移动版(如 example.com/ → example.com/m/),所有逻辑仍走同一套 Apache 配置。需在根目录 .htaccess 或虚拟主机配置中添加:
- 启用重写引擎:
RewriteEngine On - 用
RewriteCond检测常见移动端 User-Agent 字符串(含 iOS、Android、Mobile、iPhone、iPad 等):RewriteCond %{HTTP_USER_AGENT} "android|blackberry|googlebot-mobile|iemobile|ipad|iphone|ipod|opera mobile|palmos|webos" [NC] - 匹配根路径或首页请求,并重写到
/m/index.php(不加[R]即为内部重写):RewriteRule ^$ /m/index.php [L]RewriteRule ^index\.php$ /m/index.php [L] - 若需对所有非静态资源路径都适配移动端,可扩展为:
RewriteCond %{HTTP_USER_AGENT} ... [NC]RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /m/$1 [QSA,L](注意:此规则需谨慎放置,避免干扰 CSS/JS 等静态文件)
检测移动端后 302 重定向到 m. 子域名
适合完全独立部署的移动端站点(如 m.example.com),需 DNS 解析支持且后端服务独立。使用 [R=302,L] 实现临时跳转(上线稳定后可换 R=301):
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
RewriteCond %{HTTP_USER_AGENT} "android|mobile|iphone|ipad|iemobile|opera mini" [NC]-
RewriteCond %{HTTP_HOST} ^example\.com$ [NC](限定仅对主域名生效,避免循环) RewriteRule ^(.*)$ https://m.example.com/$1 [R=302,L]
注意:重定向后原请求方法(如 POST)会丢失,因此该方式**不适用于表单提交类接口**,仅推荐用于页面浏览类请求。
兼顾桌面与移动端的静态资源路由
若 PC 和移动版共用部分资源(如图片、CSS),但希望移动端加载压缩版,可通过条件重写实现路径映射:
- 先判断是否为移动端:
RewriteCond %{HTTP_USER_AGENT} ... [NC] - 再匹配特定资源路径,如
/images/logo.png→ 重写为/m/images/logo.min.png:RewriteRule ^/images/(.*)$ /m/images/$1.min [L] - 务必配合
RewriteCond %{REQUEST_FILENAME} !-f,确保真实存在的文件不被覆盖
调试与验证要点
实际部署前建议验证行为是否符合预期:
- 用
curl -H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15" http://example.com/模拟移动端请求,观察响应头(是否含Location)和返回内容路径 - 禁用缓存测试:重定向规则首次用
R=302,避免浏览器缓存 301 导致修改不生效 - 检查日志:
RewriteLog(旧版)或启用LogLevel alert rewrite:trace3(新版 Apache)定位匹配失败原因 - 确保
mod_rewrite已启用,且配置位置允许覆盖(AllowOverride All)


















