Heim > Backend-Entwicklung > PHP-Tutorial > php的web框架怎么实现单入口

php的web框架怎么实现单入口

WBOY
Freigeben: 2016-06-06 20:26:03
Original
1696 Leute haben es durchsucht

我下载了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

<code>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;
    }
}</code>
Nach dem Login kopieren

使用单入口的app,控制不让访问代码所在目录,一般有两种实现:

  1. 使用web server的rewrite 规则,把源码所在目录的.php文件排除在外。

  2. 把你的入口文件单独放在一个文件夹,且作为网站root目录,源码在上层目录。

重写规则吧 非文件或目录 - List Item

看下对比

多入口即通过访问不同的 php 文件运行对应的功能

<code>index.php - 网站首页

list.php?page=5 - 内容列表页
 
article.php?id=12 - 内容详细页
 </code>
Nach dem Login kopieren

单一入口程序都是在访问index.php时附带一个特定的参数

<code>
index.php?action=list 就可以定义为访问内容列表页
index.php?action=info 则可以定义为访问内容详细页</code>
Nach dem Login kopieren

index.php的内容

<code>$action=$_GET['action']==''?'index':$_GET['action'];

include('files/'.$action.'.php');</code>
Nach dem Login kopieren

正常的根目录下面就你只需要放一个index.php 就可以实现您网站所有的功能。

在nginx情况下隐藏index.php,需要修改nginx的配置文件。

<code>location / {
                if (!-e $request_filename) {
                        rewrite ^/(.*)$ /index.php/$1 last;
                }   
            }</code>
Nach dem Login kopieren

楼主,单入口访问是针对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的一个方法.

<code>$c = $_GET['c']; //获取controller
$a = $_GET['a']; //获取action
require_once AROOT.'controller/'.$c.'/'.$a.'.class.php'; //载入文件/controller/user/login.class.php
$o = new $c.'Controller'; // 新建对象userController
call_user_func(array($o,$a));   //调用对象$o(userController)里的方法$a(login)</code>
Nach dem Login kopieren

实际编写应用的过程,就是不断的添加controller和action并把它实现,比如:

<code>class defaultController extends appController {
    function __construct() {
        parent::__construct();
    }
    function index() {
        $data['title'] = $data['top_title'] = '首页';
        render( $data );
    }
}</code>
Nach dem Login kopieren

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相关设置等……

Verwandte Etiketten:
php
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage