php的web架構怎麼實現單入口

來源:互聯網
上載者:User
我下載了ci,slim,laravel架構,上傳到我的ubuntu+nginx+php主機上,但是我發現,隨便這三個架構的任意一個目錄中放一個test.php檔案,輸出 echo "hello world",然後這個檔案竟然能在瀏覽器上訪問。

那麼請問,這些架構不是單入口的嗎,只能通過index.php訪問,可是為什麼這裡能以目錄+檔案名稱的形式越過index.php進行訪問嗎,那隨便一個檔案都能被外部存取了,還有什麼安全性和隔離性可言呢。

還有就是怎麼隱藏index.php這個檔案呢,直接通過網域名稱根目錄訪問各頁面路由。

回複內容:

我下載了ci,slim,laravel架構,上傳到我的ubuntu+nginx+php主機上,但是我發現,隨便這三個架構的任意一個目錄中放一個test.php檔案,輸出 echo "hello world",然後這個檔案竟然能在瀏覽器上訪問。

那麼請問,這些架構不是單入口的嗎,只能通過index.php訪問,可是為什麼這裡能以目錄+檔案名稱的形式越過index.php進行訪問嗎,那隨便一個檔案都能被外部存取了,還有什麼安全性和隔離性可言呢。

還有就是怎麼隱藏index.php這個檔案呢,直接通過網域名稱根目錄訪問各頁面路由。

你現在對單一入口的理解有點問題:單一入口指的是你的應用是通過一個入口檔案進入的,其實你的單一入口的程式不就是個 PHP 檔案嘛,也沒什麼特別的,為什麼其它程式就不能被訪問呢?你可能要說因為它是單一入口(這隻是你臆想出來的),Web 服務器可不認為只有它可以訪問,能限制誰允許被訪問,誰不允許被的就只有 Web 服務器,可以用它來限制只有你要的 PHP 被訪問,其它的不允許。

另外:架構的源碼應該是放到 webRoot 之外的,只有需要被訪問的程式放在 webRoot 裡,比如你的 index.php 還有一些靜態資源。

如何?限制只有單一入口這一個 PHP 訪問,可以去查對應的架構所對應的 Web 服務器的寫法:

比如我是 YII2 加 Nginx

server {    server_name xxx.idarex.com;        index index.php;    set $rootdir /var/www/html/idarex/passport/web;    root $rootdir;    location / {        try_files $uri $uri /index.php?$args;    }    location ~ \.php$ {        include fastcgi_params;        fastcgi_index index.php;        fastcgi_param SCRIPT_FILENAME $rootdir/index.php;        fastcgi_pass 127.0.0.1:9000;    }}

使用單入口的app,控制不讓存取碼所在目錄,一般有兩種實現:

  1. 使用web server的rewrite 規則,把源碼所在目錄的.php檔案排除在外。

  2. 把你的入口檔案單獨放在一個檔案夾,且作為網站root目錄,源碼在上層目錄。

重寫規則吧 非檔案或目錄 - List Item

看下對比

多入口即通過訪問不同的 php 檔案運行對應的功能

index.php - 網站首頁list.php?page=5 - 內容列表頁 article.php?id=12 - 內容詳細頁 

單一入口程式都是在訪問index.php時附帶一個特定的參數

index.php?action=list 就可以定義為訪問內容列表頁index.php?action=info 則可以定義為訪問內容詳細頁

index.php的內容

$action=$_GET['action']==''?'index':$_GET['action'];include('files/'.$action.'.php');

正常的根目錄下面就你只需要放一個index.php 就可以實現您網站所有的功能。

在nginx情況下隱藏index.php,需要修改nginx的設定檔。

location / {                if (!-e $request_filename) {                        rewrite ^/(.*)$ /index.php/$1 last;                }               }

樓主,單入口訪問是針對PHP程式而言,你手動在瀏覽器輸入項目的目錄結構肯定是可以的啊!

在允許直接存取的檔案開頭(頁面控制器或者前端控制器)定義入口:
if (!defined('APP_ROOT')) define('APP_ROOT', './');
在不允許直接存取的檔案開頭這樣寫:
if (!defined('APP_ROOT')) exit();

可以通過配置rewrite重寫規則實現URL的RESTful,比如Nginx:
rewrite ^/post/([0-9]+)$ /post.php?id=$1;
訪問 /post/1024 Nginx會轉成 /post.php?id=1024 來處理.

以下轉自: http://ftqq.com/open-source-projects/lazyphp/
前端控制器 /index.php?c=user&a=login
載入名為user的控制器(controller),並執行名為login的方法(action).

實現上,controller被放到AROOT.controller目錄下,以class形式存在,而action就是這個class的一個方法.

$c = $_GET['c']; //擷取controller$a = $_GET['a']; //擷取actionrequire_once AROOT.'controller/'.$c.'/'.$a.'.class.php'; //載入檔案/controller/user/login.class.php$o = new $c.'Controller'; // 建立對象userControllercall_user_func(array($o,$a));   //調用對象$o(userController)裡的方法$a(login)

實際編寫應用的過程,就是不斷的添加controller和action並把它實現,比如:

class defaultController extends appController {    function __construct() {        parent::__construct();    }    function index() {        $data['title'] = $data['top_title'] = '首頁';        render( $data );    }}

rewrite是最簡單的 另外php這個單入口也就那麼回事了 寫成index.php?act=buy&id=20和buy.php?id=20有區別麼

laravel的index.php檔案是放在public檔案夾下面的,所有的靜態檔案js,css這類的都可以放在這個public下面,nginx只要設定到這個public目錄就行了,其他檔案夾下的檔案是訪問不了的。還有架構都是有執行流程的, 即使你訪問了一個其他的檔案,架構不通過index.php引入啟動,訪問到了也沒什麼實際作用。除非那些php檔案事先就是留好後門的。

認真你就輸了,php就是指令碼語言,你放哪裡,怎麼訪問都需要你人為控制的,想實現安全性那就需要一系列的措施的,包括伺服器的設定,web伺服器相關設定,php相關設定等……

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.