laravel url路由中存在双斜杠(//)造成404问题

最近出现加拿大项目个别客户端海外用户出现登录失败,无法访问的问题。

问题描述一下:

  1. 安卓手机,督导端
  2. 海外用户存在该问题,国内用户没有这个问题
  3. 国内正常访问无问题,启用香港代理vpn会出现这个问题
  4. ios一切正常

 

项目背景描述

项目运行在美国硅谷阿里云服务器机房,由于是跨国直播教学平台,考虑到数据同步的即时性,当初考虑使用全球加速专用通道,但看了价格老板犹豫了,于是国内目前使用了nginx 代理。域名使用智能dns 进行解析,海外直接访问美西服务器集群,国内访问国内nginx代理服务器。

 

从问题分析,应该不是服务器的原因,比较ios 正常,但考虑到跟区域访问有关,心里还是有点担心。于是和安卓联调,发现他请求域名路由为

 [04/Jan/2019:11:05:19 +0800] "GET //api/v1/teacher/get/protocol/url?default_lang=zh-CN&timestamp=1546571113809&app_ver=1.0.2&app_id=teacher&device_id=3661645323c068bc126b76c6c070fbde&device_os=android&device_ver=8.0.0&sign=f71f32b5654dc2820edec8228d9478cdfd58bb73ec7213fae8e47520946a2b38 HTTP/1.1" 404 627 "-" "okhttp/3.11.0"

 

出现404,路由GET //api/v1/teacher/get/protocol/url  存在双斜杠,按道理双斜杠应该自动处理的,但后端laravel 对于双斜杆,尤其是域名后紧跟的双斜杆处理的方式很奇怪,会把第一个路由参数(吃掉);

 

呐!这个样子:

请求:http://live.ming.com//api/v1/teacher/get/protocol/url  

index.php 打印:
string(57) "$_SERVER['REQUEST_URI']://api/v1/teacher/get/protocol/url"
"App\Providers\AppServiceProvider::boot方法打印打印request()->url():
http://live.ming.com/v1/teacher/get/protocol/url"

少了/api   ,原来是laravel 路由处理将域名后的//单独处理了,以为//后面到下一个双斜杆之间认为是域名,直接去掉了

 

解决方法,

  1. 客户端修复,这个必须的
  2. 为了保证客户端未更新能及时使用,服务端在入口文件index.php 做个简单的处理。
    $_SERVER['REQUEST_URI'] = '/'.ltrim($_SERVER['REQUEST_URI'],'/');
    
    

     

 

备注:

如果是路由中间还存在双斜杆 // 我只想说,各位吧路由规范点吧,   救急的话你在入口文件里可以用正则进行处理一下//。