[英]php include working with URL, but not root path. Server configuration or coding syntax?
我最近從專用服務器環境移到了雲服務器,並且在php include的根相對路徑方面遇到了麻煩。 當我包含整個URL時,php include效果很好。 但是當我在子目錄中使用根相對路徑時,它不起作用。 有想法嗎?
使用網址
<?php include 'http://website.com/assets/includes/nav.php';?>
文件位置http://website.com/folder/page
有效,但僅在根index.php文件中。 在子目錄中不起作用
<?php include 'assets/includes/nav.php';?>
文件位置http://website.com/index
無法使用根相對路徑
<?php include '/assets/includes/nav.php';?>
文件位置http://website.com/folder/page
如果文件位於同一台服務器上(可能在99.99%的情況下是這種情況),則不應使用URL來include
它。 這是非常低效的,因為它將需要服務器額外的HTTP請求。 當然,包含在其中的是遠程Web服務器輸出的內容-不是PHP源代碼,而是已解析的輸出。 同樣,有權訪問遠程URL的任何人都可以將代碼注入您的網站。 相反,您應該使用文件系統直接訪問文件。
如果您包含以/
開頭的文件,則該文件是相對於根文件系統而不是網站根目錄的。 這就是為什么第三個示例不起作用的原因。 例如,您的Web服務器可以提供/var/www/html
,因此要在該目錄中包含文件,您需要以/var/www/html/
開頭或將其包含路徑設為相對路徑。
我通常要做的是從位於每個請求中調用的應用程序根目錄中的文件(例如配置文件)中:
set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__);
然后在任何其他文件中,我只可以包含相對於該應用程序的根目錄:
include 'path/to/subdirectory/file.php';
您只需要知道重復的文件名即可。 例如,如果您有:
/var/www/html
├── class
│ ├── controller
│ │ ├── include.php
│ │ ├── FruitController.php
├── include.php
然后在FruitController.php
文件中include include.php
,它將檢查get_include_path()
的第一個路徑,如果找不到,請檢查下一個路徑,直到找到包含的文件或返回一個警告或錯誤。 因此,根據您放置在set_include_path()
的順序,它將包含/var/www/html/include.php
或/var/www/html/class/controller/include.php
執行此操作的另一種方法,並且還可以對要包含的內容添加顯式控制,這是將以下內容放入應用程序根目錄中的文件中:
define('APP_ROOT', __DIR__);
然后在其他任何文件中執行以下操作:
include APP_ROOT . '/path/to/subdirectory/file.php';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.