簡體   English   中英

php包括使用URL,但不包括根路徑。 服務器配置或編碼語法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM