2016-06-12 116 views
0

我正在用PHP寫一個CMS,所以我希望允許用戶在不中斷應用程序的情況下更改根文件夾的名稱。我目前正在嘗試使用特定於目錄的.htaccess文件爲自定義錯誤頁面設置一些文件處理。我的文件樹相對如下:ErrorDocument和.htaccess

MAMP > 
| htdocs > 
| | cms > 
| | | .htaccess 
| | | index.php 
| | | cms_files > 
| | | | info.json 
| | | | . . . 
| | | | error_pages > 
| | | | | errors.php 
| | | | | 

鑑於我已經標記'cms'的文件夾應該能夠被修改。

所以我的問題是,在我的.htaccess文件中,我使用ErrorDocument 404 /cms/cms_files/error_pages/errors.php,處理該文檔中的錯誤代碼,這很好。但是,正如我所說的,我需要能夠在不破壞ErrorDocument文件路徑的情況下更改'cms'的名稱,並且從我在網上搜索的所有內容看來,我似乎找不到任何能夠讓我設置相對路徑的內容.htaccess,相對於它當前所在的目錄。

基本上我希望能夠像做

ErrorDocument 404 CURRENT_DIRECTORY/cms_files/error_pages/errors.php 

避免硬編碼的根文件夾。

有沒有簡單的方法來做到這一點?或者可能是一個使用PHP而不是.htaccess的替代選項?提前致謝!

p.s. .htaccess文件和error_pages文件夾必須保留在其各自的目錄中,以防用戶想要創建多個cms安裝,所有特定於安裝的信息必須包含在其中的一個文件夾(本例中爲'cms')文件夾中。這是另一個警告,爲什麼該文件夾必須能夠改變名稱而不會中斷。

回答

1

根據Apache文檔,它看起來像相對路徑根本不支持:(https://httpd.apache.org/docs/2.4/custom-error.html

ErrorDocument指令的語法是:

的ErrorDocument < 3位數代碼 > < 動作>

其中動作將被視爲:

  1. 要重定向到的本地URL(如果操作以「/」開頭)。

  2. 要重定向到的外部URL(如果該操作是有效的URL)。

  3. 顯示文本爲 (如果以上都不是)。該文本必須用引號引用 (「),如果它由多個單詞。

但是,如果你讀的文檔中進一步下跌,這聽起來像你可以傳遞更多的數據到重定向的URL:

重定向到另一個URL可能很有用,但前提是某些信息可以通過,然後可以用於更清楚地解釋或記錄錯誤情況。

爲了達到這個目的,當發送錯誤重定向時,會設置額外的環境變量,這些環境變量將通過將'REDIRECT_'添加到原始標題名稱中而從提供給原始請求的標題中生成。這爲錯誤文檔提供了原始請求的上下文。

閱讀所有可用重定向信息的文檔。你可能會發現一些有用的東西。

也許您將所有404重定向到某種控制器,該控制器會通過PHP將用戶重定向到正確的404頁面,並給出額外的重定向信息。

+1

謝謝你的回答,這是一個恥辱,沒有這樣做的本地方法,但我想我可能只需要提供一個額外的文件,我希望沒有其他文件,但如果它是唯一的選擇,那麼我想這是唯一的選擇。再次感謝! –

0

您可以在服務器的根目錄使用的的ErrorDocument一個PHP文件,像這樣

的ErrorDocument 404 /404.php

廣場/404.php因爲它會用於所有404處理。

404.php文件將讀取請求的路徑,請檢查是否路徑是一個子目錄,如果是這樣,你可以使用包括重定向要麼顯示一些內容或者將用戶重定向到子目錄中的404.php頁面。

<?php 
// Get the path that was requested 
$pathComponents = explode('/',$_SERVER['REQUEST_URI']); 

// The first element on the path is the directory of interest 
$baseDirRequested = $pathComponents[0]; 

// If the directory exists, either include or redirect to that 404 file 
if (is_dir($baseDirRequested)) { 
     // Include 
     include $baseDirRequested.'/404.php'; 
     // -- or -- 
     // Redirect 
     header('Location: '.$baseDirRequested.'/404.php'); 
     exit; 
} else { 
     echo 'You are really lost'; 
} 

在子目錄404.php

<?php 
// 404 for search engines 
header("HTTP/1.1 404 Not Found"); 
?> 
<!-- HTML for people --> 

使用包含的好處是,你可以提供你想要的任何內容,它可能是一個更流暢的用戶體驗。您可能更願意使用重定向將用戶路由回子目錄邏輯。

我還沒有測試過,可能需要一些調整。

相關問題