以下问题。我有2个php文件。
1.)../folder/main.php
2.)../folder/subfolder/page_coocking.php
3.)../folder/subfolder/bread.php
4.)../folder/subfolder/video_folder/video1.mp4
其中包含以下文本:
1.) main.php
..
include('subfolder/page_coocking.php');
..
2.) page_coocking.php
..
include('bread.php');
..
3.) bread.php
..
<video controls poster="video_folder/video1.mp4" width="400" height="">
<source src="video_folder/video1.mp4"/>
</video>
这就是我想要的代码,如果仅打开page_coocking.php
,就会显示视频,但是如果打开main.php
,则视频将无法工作。我必须写bread.php
..
<video controls poster="subfolder/videos/Rolade.mp4" width="400" height="">
<source src="subfolder/video_folder/video1.mp4"/>
</video>
有权访问视频。为什么?无法解释自己。也许其他样式没有包含?
答案 0 :(得分:1)
如果您采用某种MVC或前端控制器,它将对您有很大帮助。您所采用的方法充其量很难维持。
您还希望非常清楚面向php文件的函数之间的区别,例如include和require可以与服务器的文件系统一起使用,以及“ web space”(相对于Web服务器的webroot)。
在这种情况下,您都需要这样做,因为您是直接使用Web空间运行脚本,并且包含了与Webroot无关的php脚本。
您的问题是您的Webroot是“文件夹”。因此,对于从网络服务器请求的网址中的任何内容(例如main.php),该网址为http://yourserver.tld/main.php
在main.php中,如果发出代码然后要求浏览器找到与其相关的内容,则相对路径为:http://yourserver.tld/video_folder/video1.mp4
这当然不起作用,因为视频实际上位于http://yourserver.tld/subfolder/video_folder/video1.mp4
相对的Web根目录确实具有当前目录的概念,因此,当您在subfolder
中执行脚本(如Bread.php)时,此时的Web路径为:
http://yourserver.tld/subfolder/
,因为您正在执行http://yourserver.tld/subfolder/bread.php
。当Bread.php发出相对路径时,它将转换为http://yourserver.tld/subfolder/video_folder/video1.mp4
。
Frameworks采用的做法是拥有一个与php脚本源分开的webroot文件。仅需要直接从Web空间返回的资产(.css,.js,图像)保留在该目录结构中。将有一个通过其传递所有请求的前端控制器脚本(通常只有index.php),然后前端控制器可以根据需要包含其他脚本,以进行路由。
即使使用简化的main.php,您也可以通过将其他脚本移动到目录中来采用这种做法,以便文件结构更像:
/project
/web (set as webroot for http server, only index.php here)
/web/js
/web/css
/web/images
/web/videos
/include (php includes and classes)
在index.php(main.php)中,您可以设置将处理所有相对路径的常量或变量。