php站点包含的问题

时间:2019-01-03 23:18:18

标签: php html

以下问题。我有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>

有权访问视频。为什么?无法解释自己。也许其他样式没有包含?

1 个答案:

答案 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)中,您可以设置将处理所有相对路径的常量或变量。