Загрузить другие файлы (из-за пределов public_html) в разделе index.php

#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. Вчера я посмотрел, но не увидел никаких сигналов тревоги, все выглядит хорошо.