2012-12-12 96 views
0

我正在重新設計自己的php mvc框架。如何防止顯示PHP MVC/LAMP中的資源http請求

我有默認情況下由/index.php處理每個請求,這會觸發mvc路由進程,執行請求並返回正確的視圖。每個請求是根據一個「Q」 GET參數,Drupal的風格路由,像

/index.php?q=anApplication/aController/theAction/arg1/.../moreArguments 

這工作不錯,並使得清潔網址的事情用mod_rewrite容易。好。

我有一個目錄樹是這樣的:

/public 
    |----themeName 
    |--------| 
      |----page.tpl 
      |----content.tpl 
      |----etc.  
/private 
    |----sourceDirectory 
    |----moreSources 

不想是存儲在私人和公共目錄中的文件直接送達像一個HTTP請求:我不希望像

mySrv /公/ THEMENAME/page.tpl

顯示一個死的模板,或任何資源這不是一個圖像,繞過我的核心處理程序 - index.php。

我想我可以實現與重寫的配置是這樣的

RewriteEngine on 
RewriteBase/
RewriteRule ^(.*)$ index.php?q=$1 [QSA,L] 

但隨後該框架將只啓用了mod_rewrite的網站工作,因爲這將改寫所有現有的和非現有資源。

我要求的是:還有另一種方法可以讓我選擇的資源(如index.php)提供每個請求,現有的或不存在的請求?

謝謝

+0

爲什麼你在公用文件夾中有模板? – Stan

+0

因爲我通常共享模板文件夾與通用資源,如CSS,JS等 – brazorf

+0

這不是一個好主意,恕我直言。無論如何, – Stan

回答

4

只需將所有模板等存儲在public_html文件夾之外即可。

這將允許PHP訪問,但外部世界無法訪問該文件。

+0

+1。但爲什麼不使用啞常數來防止直接訪問它們? – Yang

1

最簡單和更便攜的方法是將除index.php之外的所有內容都拉出文檔根目錄。 PHP仍然可以包含文件並執行其他任何操作。

我沒有試過,但如果你把一個index.php文件舊文檔樹

---/ app/new-index.php 
    | 
/public/
    | 
/private/... 
    | 
    index.php 

,然後添加在new-index.php

<?php 
    chdir('..'); 
    require 'index.php'; 
?> 

終於開始重新配置Apache,以便DocumentRoot實際上變成/app,那麼所有東西都應該像以前一樣工作 - 除了'/'之外的任何URL都停止對Apache有意義,並且所有的都可以在suita上登陸ble ErrorDocument 404.

Note:「everything should work」,except HTTP redirections。你可以從FS讀取一個非解釋的PHP文件,但是你不能再從本地主機上的Apache等獲得它的解釋內容。此外,你應該驗證任何現有的代碼不使用DOCUMENT_ROOT全局變量;如有需要,您可以覆蓋它。