文章介绍了apache重写规则的五大核心应用:一、基于user-agent实现客户端差异化重写;二、利用referer防盗链并控制响应;三、按文件状态(-f/-d)动态路由;四、多条件组合(and/or)构建复杂策略;五、结合环境变量与子请求实现运行时信息注入。

一、基于用户代理的差异化重写
通过匹配 HTTP_USER_AGENT 字符串,可实现对不同客户端(如桌面浏览器、移动设备、爬虫)返回不同资源路径。该机制依赖 RewriteCond 对 %{HTTP_USER_AGENT} 变量的精确提取与判断,配合 RewriteRule 执行目标跳转。
1、启用重写引擎:在 .htaccess 或虚拟主机配置中添加 RewriteEngine On。
2、匹配 Firefox 浏览器并重写 index.php 为 index.m.php:RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5\.0.*Firefox,随后添加 RewriteRule ^index\.php$ index.m.php [L]。
3、匹配移动端 UA(含 Android、iPhone 关键词)并重写为 mobile.php:RewriteCond %{HTTP_USER_AGENT} (Android|iPhone|Mobile),后接 RewriteRule ^(.*)$ mobile.php?path=$1 [L,QSA]。
二、防盗链重写与响应控制
利用 %{HTTP_REFERER} 变量识别请求来源,阻止非授权站点嵌入本站资源,同时支持自定义响应行为(如返回占位图或拒绝访问)。
1、启用防盗链基础条件:添加 RewriteCond %{HTTP_REFERER} !^$ 排除空 referer 请求。
2、排除本站域名(含 www 和非 www 形式):RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com/ [NC]。
3、对图片资源实施拦截:RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F,NE];若需替换为指定图片,则将最后部分改为 RewriteRule \.(jpg|jpeg|png|gif|webp)$ /images/forbidden.png [R=302,L]。
三、按请求文件状态动态路由
使用 -f(文件存在)、-d(目录存在)、-s(非空文件)等测试标记,使重写逻辑具备文件系统感知能力,适用于静态资源直通、缺失资源兜底等场景。
1、仅当请求路径不对应真实文件时才交由前端控制器处理:RewriteCond %{REQUEST_FILENAME} !-f 与 RewriteCond %{REQUEST_FILENAME} !-d 连续使用。
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
2、添加主路由规则:RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L],确保所有未命中物理文件的请求均被 index.php 拦截。
3、若需排除特定扩展名(如 .css、.js)免于重写,可在 RewriteCond 中追加否定条件:RewriteCond %{REQUEST_URI} !\.(css|js|woff2|svg)$ [NC]。
四、多条件组合与逻辑运算
RewriteCond 默认以 AND 方式串联,但可通过显式 [OR] 标志实现 OR 逻辑;混合使用可构建复杂访问策略,例如多 IP 段放行或多重域名匹配。
1、允许来自两个独立 IP 段的请求访问管理接口:RewriteCond %{REMOTE_ADDR} ^192\.168\.1\. 后接 [OR],再写 RewriteCond %{REMOTE_ADDR} ^10\.0\.0\.。
2、对匹配任一条件的请求应用限制规则:RewriteRule ^admin/.*$ /403.html [R=403,L]。
3、避免误判本地回环地址,补充排除条件:RewriteCond %{REMOTE_ADDR} !=127.0.0.1 放在组合条件最前,确保本地调试不受影响。
五、环境变量与内部子请求协同
借助 %{ENV:var} 和 %{LA-U:var} 等特殊变量,可在重写过程中引入运行时环境值或跨阶段获取认证信息(如 REMOTE_USER),突破标准变量生命周期限制。
1、在验证完成后获取用户名并注入重写参数:RewriteCond %{LA-U:REMOTE_USER} (.+),随后用 %1 在 RewriteRule 中引用。
2、将用户名附加到查询字符串:RewriteRule ^profile\.php$ profile.php?user=%1 [QSA,L]。
3、设置环境变量供后续模块使用:SetEnvIfNoCase User-Agent "MSIE" is_ie,再通过 RewriteCond %{ENV:is_ie} 1 触发 IE 专属重写分支。










