在index.php下加载其他文件(从public_html外部)

时间:2019-03-16 12:38:17

标签: php .htaccess

我想用简单的index.php?do=login

加载index.php下的每个页面

例如,当打开链接index.php?do=login/login/时,(从public_html外部加载了login.php文件,因此一切都在index.php下完成,而不是在index.php下完成)每个动作在public_html中都有一个单独的php文件!

这是我已经尝试过的方法,我可以吗? (我不确定我在做什么是否有任何安全漏洞,所以请提出建议)

index.php

<?php

// application path (outside public_html)
define('FILESPATH', APP.'../application/actions/');

// Default file
$file_name = 'home_page';

// e.g. index.php?do=login
if(isset($_GET['do'])){
    $file_name = rtrim($_GET['do'],'/');
}

// Set file path
$fpath = FILESPATH."{$file_name}.php";

// Make sure user input has valid characters
if(preg_match('/^[A-Za-z0-9_]+$/', $file_name) !== 1 OR ! file_exists($fpath)){
    // Error
    require_once('404.php');
    die();
}

// Load the do=file
require_once($fpath);

// Nothing more comes in index.php

login.php

<?php

// Load template file header
require_once('header_template.php');


//
// Stuff that happens in login.php
// Like checking if username has valid characters then searching for it with pdo in db,
// password_verify(), etc...
//


// After the stuff done above load login html template
require_once('login_template.php');

// Load template footer
require_once('footer_template.php');

.htaccess

要使用site.com/login/等而不是site.com?do=login来运行

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond   %{REQUEST_FILENAME} !-d
    RewriteCond   %{REQUEST_FILENAME} !-f
    RewriteRule   ^((?s).*)$ index.php?do=$1 [QSA,L]
</IfModule>

1 个答案:

答案 0 :(得分:0)

听起来您正在寻找的是路由器。我不建议您重新发明轮子,而是建议您看看已经进行了一些使用和测试的现有设备。

Respect/Rest轻巧,用途广泛且易于使用。

use Respect\Rest\Router;

$r3 = new Router('/index.php');

// endpoint: /index.php/
$r3->get('/', function() {
    return 'Hello World';
});

// endpoint: /index.php/login
$r3->any('/login', function() {
    // use $_POST data to validate user
    return 'Login Success';
});

// endpoint: /index.php/item/123
$r3->get('/item/*', function($id) {
    $item = $db->fetchItem($id);
    return json_encode($item);
});

没有比这容易的多了……nJoy!