blessing-skin-server icon indicating copy to clipboard operation
blessing-skin-server copied to clipboard

一处资源文件疑似因为URL拼接的问题会不时产生访问错误

Open ghost opened this issue 3 years ago • 5 comments

The Problem 问题描述

一般来说直接访问域名就正常,但如果不小心加入了 “index.php”,那么资源文件meta.js就无法加载了。而且不仅是首页,其他需要引用meta.js的页面具有一样的问题,比如“index.php/skinlib” 而meta.js在服务器上存在,同时没有更改任何代码包括.htaccess文件等。 其他资源文件均正常加载。 所以我怀疑这个文件的加载流程是直接拼接URL得来的。

经过搜索得知问题文件在 resources/views/shared/head.twig 问题代码引用方式是 <script src="{{ url('/meta.js') }}"></script> 差不多符合我的猜想。既然现在BS已经深度放弃对虚机的支持,看起来也对二级目录的支持极不友好,此处建议为基于domain name的引用或者规定一个HTML的base标签,然后直接输入文件名就行了(ps.我感觉这样更规范一些)(pss.该标签无任何兼容性问题,它甚至兼容IE,也符合Html5和Html4.01规范)(psss.参考文件Here

Environment 运行环境

  • Blessing Skin 版本 (Version of Blessing Skin): 5.2.0(现在的最新Release)
  • PHP 版本 (Version of PHP): 7.3.28
  • Apache / Nginx: Apache2.4.46
  • 什么浏览器,出现错误时的地址栏 URL 是什么 (Which browser and URL): https://skin.nciyuan.net/index.php

Error Message 错误信息

该问题截图在 image.png

Steps to Reproduce 重现步骤

首先访问 https://skin.nciyuan.net,然后在 ”新版Microsoft Edge浏览器“ 中轻轻的按下F12按钮 然后在一个虔诚的态度下打开 https://skin.nciyuan.net/index.php,然后说“微软大法好”,并坐和放宽等待。

ghost avatar May 09 '21 14:05 ghost

正常来说 URL 中是不应该有 index.php 的。如果是人为的,请避免让 URL 带有 index.php;如果是页面上的链接带有的,请指出来以便让我们修复。

g-plane avatar May 09 '21 15:05 g-plane

我是在昨晚调试一个Apache服务器配置文件时,在不同二级域名之间直接将二级域名替换,没有去除index.php的情况下才发现这个问题的。我觉得既然都是PHP程序,那么带不带入口文件都没有什么问题。 我的发现是,正常运行的程序内不会存在引用index.php/?xxxxx的形式。但是我觉得这仍旧可能是一个不必要的代码或者不严谨的写法。 因为本程序既不支持虚拟主机,也几乎是不支持多级目录,同时这个文件(meta.js)就在程序public目录下的第一级,所以建议去除url+meta.js的拼接方式,直接/meta.js就可以了。即使这个文件以后更名或移动,直接更改就可以。 另外其它资源文件,比如app目录下的任何js文件不会因为url是否带有index.php而改变。

ghost avatar May 09 '21 18:05 ghost

看起来是只有 meta.js 文件受到影响,其它位于 app 目录的文件没问题?

g-plane avatar May 09 '21 23:05 g-plane

发现了还有一些问题,除了meta.js之外,插件目录也存在URL直接拼接导致的问题。比如插件关闭注册功能会在首页加入一个modifyButton.js,而这个js的引用链接是 https://skin.nciyuan.net/index.php/plugins/disable-registration/assets/modifyButton.js?v=1.0.3,很明显也是错误的。在这种情况下有一个昨天没有注意到的问题,favicon.ico也因为拼接问题在URL中多出一个index.php/而无法显示。 经过我的排查,发现在favicon上,不仅是head中的icon,还有 shortcut icon,apple-touch-icon均加入了index.php。 meta.js的引用方式是{{ url('/meta.js') }},其它图标引用的方式是'{{ favicon }}'并非套用url函数拼接的方法。 我能找到的是 /config/options.php 下存在一个 favicon_url项,而看起来和这个issue并没有什么关系,但是和问题有关系。 因为一旦带有index.php访问,head里的内容就会变样。 而我认为问题出在/app/Http/View/Composers/HeadComposer.php第52行。在第51行取得options.php中favicon的位置后,又套了一层url函数,成为url+favicon_url,所以一旦url出现不可预知的结果,那么问题会直接导致不可用,所以我临时注销掉这行,href中会变成app/favicon.ico,就正常了。 同样的我感觉这个插件资源文件的问题也差不多。

目前已知没有问题的文件是除了meta.js、插件的额外引入js、favicon之外的其它资源文件。

我还看了一下这些代码,我认为我开issue时提到的修改方法也许并不管用,因为包括全局变量base_url在内的多个js路径的变量、语言文件等均以url函数为支撑,只修改一个就不现实,也不解决问题。

但是只要经过url套一下就直接把host和uri都套进去了,我想尝试修改,但是由于没有时间,只能这样了。

ghost avatar May 10 '21 21:05 ghost

补充一个可能是BUG的问题,但是是仓库里的,没弄明白怎么整得https://github.com/bs-community/blessing-skin-plugins/issues/125

ghost avatar Dec 03 '21 16:12 ghost