Laravel传入http/https参数时404页面图片加载异常问题
这个问题我之前排查过,核心原因其实是浏览器对相对路径的解析逻辑在搞鬼。当你访问www.test.com/http://anything这类URL时,浏览器会把/http://anything当成当前页面的层级路径,导致页面里所有用相对路径引用的静态资源(图片、CSS、JS)都会被错误解析成www.test.com/http/images/xxx.jpg这种不存在的路径,自然就加载失败了。
下面给你几个可行的解决办法:
改用绝对路径加载静态资源
Laravel提供了asset()辅助函数来生成基于网站根目录的绝对路径,把你404页面(包括继承的master模板)里的资源引用都改成这个格式就行。比如:
原来的相对路径写法:<img src="images/404-banner.jpg">改成:
<img src="{{ asset('images/404-banner.jpg') }}">这样不管当前URL是什么奇葩格式,资源都会从网站根目录正确加载,不会出现路径错误。
全局检查模板的资源引用
因为你的404页面继承了master模板,别忘了同步修改master里的所有静态资源路径(比如导航栏logo、全局CSS/JS文件),确保这些资源也用asset()或者绝对路径,不然整个页面的样式和脚本也会出问题。可选:通过.htaccess拦截异常URL
如果你想从根源避免用户访问这类奇怪的URL,可以在Laravel根目录的.htaccess文件里添加重写规则,直接把包含http://或https://的请求重定向到标准404页面:RewriteEngine On # 拦截包含http/https前缀的异常路径 RewriteCond %{REQUEST_URI} ^/http[s]?:// RewriteRule ^(.*)$ /404 [L,R=301]这样用户访问这类URL时会直接跳转到
www.test.com/404,路径恢复正常,资源自然就能加载了。
改完之后你再测试一下www.test.com/http://anything这个地址,应该就能看到正常的404页面了。
内容的提问来源于stack exchange,提问作者Emad

