如何在Apache/PHP服务端检测PWA发起的Web请求?
如何在Apache/PHP服务端检测iOS PWA模式
好问题!iOS上添加到主屏幕的PWA(Web App模式)确实带有服务端可直接检测的专属请求标识,完全不用依赖Cookie或者前端提前标记,这是最简便的方案。
核心检测依据:两个专属请求头特征
iOS的PWA模式发起请求时,会自带两个关键标识,你可以任选其一或结合判断:
- X-Requested-With 请求头:PWA模式下这个头会被系统设置为
com.apple.mobilesafari,而普通Safari浏览器请求时不会携带这个头(或者值为空)。 - User-Agent 字符串:PWA模式下的UA会包含
AppleWebApp/[版本号]这样的片段(比如AppleWebApp/605.1.15,版本号随iOS更新变化),普通Safari的UA则没有这个片段。
PHP端直接检测的代码示例
直接读取服务端全局变量就能判断,代码很简洁:
<?php $isIosPwa = false; // 获取请求头和UA信息 $xRequestedWith = $_SERVER['HTTP_X_REQUESTED_WITH'] ?? ''; $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? ''; // 结合两个条件判断,提高准确性 if ($xRequestedWith === 'com.apple.mobilesafari' || str_contains($userAgent, 'AppleWebApp/')) { $isIosPwa = true; } // 后续根据状态输出差异化内容 if ($isIosPwa) { // PWA模式:输出返回按钮 echo '<button class="back-btn">返回上一页</button>'; } else { // 普通浏览器:不输出按钮或输出其他内容 } ?>
Apache层面预配置(可选)
如果想在Apache服务器层面先完成检测,比如设置环境变量供PHP或其他脚本使用,可以用SetEnvIf指令:
# 检测iOS PWA模式,设置环境变量IS_IOS_PWA SetEnvIf X-Requested-With "com.apple.mobilesafari" IS_IOS_PWA=1 SetEnvIf User-Agent "AppleWebApp/" IS_IOS_PWA=1 # 之后PHP里可以直接通过$_SERVER['IS_IOS_PWA']获取状态
几个注意点
- 版本兼容性:
AppleWebApp/标识从iOS 11.3开始引入,现在绝大多数iOS用户都是13+版本,这个标识足够可靠;如果要兼容更早版本,可能需要额外结合window.navigator.standalone的前端检测作为兜底。 - 双重验证更可靠:单独依赖UA可能存在伪造风险,但
X-Requested-With是iOS系统在PWA模式下自动添加的,篡改难度高,建议两个条件结合判断。 - 前端兜底方案:虽然服务端检测很方便,但极端情况下(比如某些小众iOS版本或浏览器篡改请求头),可以同时保留前端JS检测:
// 前端判断是否处于PWA独立模式 if (window.navigator.standalone) { document.querySelector('.back-btn')?.classList.remove('hidden'); }
这样服务端+前端的组合方案,既能实现差异化内容输出,又能保证兼容性和准确性。
内容的提问来源于stack exchange,提问作者Riesling
相关产品推荐
相关产品推荐

