#php #.htaccess
#php #.htaccess
Вопрос:
Я хотел загрузить каждую страницу в index.php с помощью простого index.php?do=login
Например, когда открывается ссылка index.php?do=login
или /login/
, файл login.php загружается (извне public_html
), и поэтому все выполняется в разделе index.php вместо того, чтобы иметь отдельный php-файл в public_html
для каждого действия!
Это то, что я уже пробовал, у меня все в порядке? (Я не уверен, что в том, что я делаю, есть какие-либо уязвимости в системе безопасности, поэтому, пожалуйста, любезно сообщите)
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/
etc вместо 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. Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, потому что OP просто просит нас просмотреть код, и поэтому он должен быть размещен в Code Review вместо этого.
2. @MagnusEriksson Я просто спрашиваю, как лучше всего загружать файлы
index.php
извнеpublic_html
, а также включил то, что я уже пробовал: (3. Я понимаю, но SO — это когда у вас возникает какая-то конкретная проблема с вашим кодом, которую вы просто не можете решить самостоятельно. Вы просите нас просто просмотреть ваш код и дать совет. Здесь это не по теме, но по теме при просмотре кода, поэтому я бы рекомендовал вам опубликовать этот вопрос там вместо этого.
Ответ №1:
Похоже, что вы ищете маршрутизатор. Вместо того, чтобы изобретать велосипед, я бы посоветовал вам взглянуть на существующие, которые уже были использованы и протестированы.
Respect / Rest легкий, универсальный и очень простой в использовании.
use RespectRestRouter;
$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);
});
Не становится намного проще, чем это… Радуйся!
Комментарии:
1. Спасибо за предложение, я проверил репозиторий, но, похоже, последнее обновление было 3 года назад, и оно тоже не очень активно : ( Если вы профессиональный PHP-кодер, не могли бы вы, пожалуйста, проверить, видите ли вы какие-либо проблемы / уязвимости в моем коде?
2. Да, действительно, это было завершено 3 года назад и все еще работает как шарм. Ребята были очень заняты с меню Respect / Validation в последнее время, но я использую его во всех своих приложениях, отлично работает для вызовов ajax.
3. Вчера я посмотрел, но не увидел никаких сигналов тревоги, все выглядит хорошо.