
本文探讨如何在 laravel 应用程序中有效阻止移动设备访问网站,即使在浏览器开启“桌面站点”模式下。针对纯客户端 javascript 检测的局限性,我们将重点介绍利用服务器端 http user-agent 头部信息进行设备类型判断的方法,并提供具体的 laravel 实现策略和代码示例,确保无论用户如何设置,都能准确识别并响应移动设备请求。
在现代Web开发中,我们经常需要根据用户设备类型提供不同的体验或限制访问。例如,某些应用可能专为移动设备设计,或需要阻止移动设备访问特定的桌面版功能。常见的做法是利用客户端 JavaScript 检测用户代理字符串(navigator.userAgent)来判断设备类型,并据此进行重定向或内容调整。然而,这种方法存在一个显著的局限性:许多移动浏览器允许用户选择“请求桌面站点”模式。在这种模式下,浏览器会修改其发送的 User-Agent 字符串,使其看起来像桌面浏览器,从而绕过客户端 JavaScript 的移动设备检测。
原始问题中提供的 JavaScript 代码片段正是这种客户端检测的一个例子:
<script>
(function(a,b)
{
if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))window.location=b
})
(navigator.userAgent||navigator.vendor||window.opera,
'http://www.google.com/mobile');
</script>这段代码尝试通过正则表达式匹配 navigator.userAgent 来识别移动设备,一旦匹配成功就重定向到 http://www.google.com/mobile。然而,当用户在移动浏览器中启用“桌面站点”模式时,navigator.userAgent 会被修改,导致上述 JavaScript 代码失效,从而无法阻止网站的加载。
为了实现更健壮的移动设备访问控制,我们需要在服务器端进行设备类型判断。
HTTP User-Agent 头部是一个请求头,它包含有关发起请求的用户代理(通常是浏览器或应用程序)的特征字符串。这个字符串通常包括操作系统、浏览器名称及版本、渲染引擎等信息。服务器端可以通过解析这个头部信息来识别请求的来源设备类型。
例如,一个典型的桌面浏览器 User-Agent 可能看起来像这样: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
而一个移动设备 User-Agent 可能包含“Mobile”、“Android”、“iPhone”等关键词: Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.128 Mobile Safari/537.36
即使移动浏览器在“桌面站点”模式下,其 User-Agent 字符串也往往会保留一些移动设备的特征,或者至少不会完全伪装成一个主流桌面操作系统。更重要的是,服务器端在接收到请求时,可以第一时间对这个头部进行解析,从而在页面内容发送给客户端之前就做出判断和响应。
在 Laravel 应用程序中,我们可以通过 request() 辅助函数或 Illuminate\Http\Request 实例轻松访问 HTTP 请求头,包括 User-Agent。
你可以通过以下方式获取 User-Agent 字符串:
$userAgent = request()->header('User-Agent');
// 或者在控制器方法中注入 Request 实例
// public function index(Request $request) {
// $userAgent = $request->header('User-Agent');
// }手动解析 User-Agent 字符串并维护一套识别规则是非常复杂且容易出错的。幸运的是,Laravel 社区提供了优秀的第三方库来简化这一过程。jenssegers/agent 是一个广受欢迎的包,它基于 MobileDetect 库,能够准确地检测设备类型、操作系统、浏览器等信息。
安装 jenssegers/agent:
在你的 Laravel 项目根目录运行 Composer 命令:
composer require jenssegers/agent
安装完成后,你就可以在代码中使用 Agent 类了。
一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错效率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。 您是否在找一套合适后台管理系统。 您是否在找一套代码易读易懂后台
885
基本用法示例:
use Jenssegers\Agent\Agent;
$agent = new Agent();
if ($agent->isMobile() || $agent->isTablet()) {
// 是移动设备或平板
// 例如:重定向到移动版页面或显示特定提示
return redirect()->to('http://www.google.com/mobile');
} else {
// 是桌面设备
}
// 更多判断方法
// $agent->isDesktop();
// $agent->is('Windows'); // 检查操作系统
// $agent->is('Chrome'); // 检查浏览器
// $agent->platform(); // 获取操作系统名称
// $agent->browser(); // 获取浏览器名称为了在整个应用中统一管理移动设备访问限制,最佳实践是使用 Laravel 中间件(Middleware)。中间件允许你在请求到达控制器之前或响应发送给客户端之前执行逻辑。
运行 Artisan 命令生成一个新的中间件:
php artisan make:middleware CheckMobileDevice
这会在 app/Http/Middleware/ 目录下创建一个 CheckMobileDevice.php 文件。
编辑 app/Http/Middleware/CheckMobileDevice.php 文件,添加设备检测和重定向逻辑:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Jenssegers\Agent\Agent; // 导入 Agent 类
class CheckMobileDevice
{
/**
* 处理传入的请求。
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
$agent = new Agent();
// 判断是否为移动设备或平板
// 注意:这里可以根据具体需求调整逻辑。
// 如果你希望即使在“桌面站点”模式下也视为移动设备,
// 那么 isMobile() 和 isTablet() 是合适的选择。
if ($agent->isMobile() || $agent->isTablet()) {
// 如果请求的路径不是移动版页面,则重定向
// 假设你的移动版页面或提示页面路径是 '/mobile-restricted'
if (!$request->is('mobile-restricted')) {
return redirect()->route('mobile.restricted'); // 假设你定义了一个名为 'mobile.restricted' 的路由
// 或者直接重定向到外部URL,如:
// return redirect()->to('http://www.google.com/mobile');
}
}
return $next($request);
}
}注意:
在 routes/web.php 中添加一个用于移动设备受限的路由和视图:
// routes/web.php
Route::get('/mobile-restricted', function () {
return "<h1>此页面仅限移动设备访问,或您已被重定向。</h1><p>请使用桌面设备访问主站。</p>";
})->name('mobile.restricted');
// 其他需要保护的路由
Route::middleware(['web', 'check.mobile.device'])->group(function () {
Route::get('/', function () {
return view('welcome'); // 你的主页
});
// ... 其他桌面版路由
});最后,在 app/Http/Kernel.php 中注册你的中间件。你可以将其注册为全局中间件(所有请求都经过),或者注册为路由中间件(仅应用于特定路由组)。
注册为路由中间件(推荐):
// app/Http/Kernel.php
protected $middlewareAliases = [
// ... 其他别名
'check.mobile.device' => \App\Http\Middleware\CheckMobileDevice::class,
];现在,你可以在路由定义中使用 check.mobile.device 别名来应用此中间件:
// routes/web.php
Route::middleware('check.mobile.device')->group(function () {
// 你的桌面版网站路由
Route::get('/dashboard', [DashboardController::class, 'index']);
Route::get('/settings', [SettingsController::class, 'index']);
// ...
});
// 如果某个页面是移动设备友好且不应被重定向,则不应用此中间件
Route::get('/mobile-friendly-page', [MobileFriendlyController::class, 'index']);通过在 Laravel 应用中利用服务器端 HTTP User-Agent 头部信息,并结合 jenssegers/agent 等专业库,我们可以实现比纯客户端 JavaScript 更精确和健壮的移动设备访问控制。将此逻辑封装在中间件中,可以优雅地应用于需要限制访问的路由,确保即使在移动浏览器开启“桌面站点”模式时,也能正确识别并响应设备类型。然而,在实施此类策略时,应权衡其与响应式设计、用户体验以及User-Agent欺骗风险之间的关系。
以上就是在 Laravel 应用中实现精确的移动设备访问控制的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号