Apache配置实现根目录receiver.php入站请求转发至子目录路径
Apache 无感知转发请求最优方案
最优选择是使用Apache mod_rewrite做服务器内部重写,全程没有额外HTTP请求、不暴露路径变更、完整透传所有请求参数(包括POST请求体、GET查询参数、请求头),性能远高于PHP转发、外部30x跳转,完全适配你无法修改请求发送端的场景。
具体配置(.htaccess方式,适合虚拟主机/无服务器配置权限场景)
- 打开站点根目录(也就是你原来放receiver.php的目录)下的
.htaccess文件,没有就新建一个 - 写入以下规则:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^receiver\.php$ otherfolder/receiver.php [L,QSA] </IfModule>
规则参数说明
^receiver\.php$:精确匹配根路径下的receiver.php请求,不会误匹配其他子目录下的同名文件[L]:匹配到当前规则后立即停止处理后续重写规则,避免规则冲突[QSA]:自动透传原请求携带的所有查询参数,不会丢失原请求的传参- 如果你需要不区分大小写匹配路径,可以在flag里加
NC,变成[L,QSA,NC]
更高性能的配置方式(有服务器管理权限可选)
如果你可以直接修改Apache虚拟主机配置文件,把上述重写规则直接写到对应站点的<Directory>配置块中即可,比.htaccess性能更高——.htaccess每次请求都会读取解析,写在主配置中只会在Apache启动时加载一次,无额外文件读取开销。
方案优势对比
- 对比301/302外部跳转:不会给客户端返回跳转响应,不会出现POST请求被客户端自动转为GET、丢失请求体数据的问题,发送端完全感知不到路径变更
- 对比PHP HTTP转发(curl/file_get_contents类实现):无二次网络请求,没有超时、数据序列化损耗问题,性能损耗接近0
- 如果你因为环境限制无法启用mod_rewrite,可以用兜底方案:在旧的根目录
receiver.php中直接引入新路径文件,代码如下,这个方式也不会产生二次请求,仅比Apache重写多一层PHP解析开销:
<?php require __DIR__ . '/otherfolder/receiver.php';
配置验证
配置完成后直接访问原地址example.com/receiver.php,抓包确认响应状态码为200(不是301/302类跳转状态码),且数据能正常入库即可,原根目录下的旧receiver.php可直接删除。
内容的提问来源于stack exchange,提问作者Amalgama29234
相关产品推荐
相关产品推荐

