我想用简单的index.php?do=login
例如,当打开链接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>
答案 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!