如何阻止除Chromium版Edge外的所有IE及旧版Microsoft Edge访问站点
解决思路与代码修改
首先得明确不同浏览器的User-Agent特征,这是精准拦截的关键:
- IE浏览器:IE10及更早版本带
MSIE标识,IE11则用Trident/标识(UA里可能没有MSIE) - 旧版Edge(EdgeHTML内核):UA里包含
Edge/(大写E结尾) - Chromium版Edge:UA里是
Edg/(小写g结尾),同时通常会附带Chrome的标识
你现有代码已经能拦截IE,但没区分新旧Edge。我把逻辑调整得更清晰,确保只拦截目标浏览器,同时放行Chromium版Edge:
<?php $userAgent = $_SERVER['HTTP_USER_AGENT']; // 先判断是否是Chromium版Edge,直接放行 if (preg_match('/Edg\/\d+/i', $userAgent)) { // 显示登录表单 echo "登录表单内容"; } // 拦截IE或旧版Edge elseif (preg_match('/(?i)(MSIE \d+)|(Trident\/\d+)|(Edge\/\d+)/', $userAgent)) { // 显示错误提示 echo "抱歉,您的浏览器版本过低,请使用Chromium版Edge或其他现代浏览器访问本站"; } // 其他现代浏览器放行 else { // 显示登录表单 echo "登录表单内容"; } ?>
代码说明
- 优先判断Chromium版Edge:因为它的UA特征是
Edg/(小写g),用/Edg\/\d+/i忽略大小写匹配版本号,确保不会误判。 - 拦截规则:同时匹配IE的两种标识(
MSIE和Trident/),加上旧版Edge的Edge/标识,覆盖所有需要拦截的浏览器。 - 可读性优先:分开判断比写复杂的复合正则更直观,后续维护也更方便。
另外补充一点:User-Agent是可以被用户伪造的,这种方法适合普通场景的拦截,如果需要更严谨的检测,可以结合浏览器特性检测(比如检测是否支持现代JS API),但对于大多数需求来说,UA匹配已经足够。
内容的提问来源于stack exchange,提问作者Rocstar




