Как я могу написать правила .htaccess для имитации моего локального сервера, который устанавливает корень документа в каPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как я могу написать правила .htaccess для имитации моего локального сервера, который устанавливает корень документа в ка

Сообщение Anonymous »

Я пытаюсь разместить приложение на общем сервере, где я не могу контролировать конфигурацию сервера, поэтому DOCUMENT_ROOT является PROJECT_ROOT, поэтому все файлы доступны через браузер. Поэтому я пытаюсь воспроизвести то, что у меня есть на моем локальном компьютере, где у меня есть папка с именем public как DOCUMENT_ROOT, которая является подпапкой PROJECT_ROOT.
Я запускаю свой локальный сервер командой:

Код: Выделить всё

php -S localhost:8888 -t public
который устанавливает общедоступную папку как DOCUMENT_ROOT. Структура каталогов следующая:

Код: Выделить всё

project_root
|
|---controllers
|   |
|   |----notes
|   |        |
|   |        |---create.php
|   |        |---index.php
|   |        |---show.php
|   |
|   |
|   |---about.php
|   |---contact.php
|   |---index.php
|
|
|---Core
|   |
|   |---Database.php
|   |---functions.php
|   |---Response.php
|   |---router.php
|   |---Validator
|
|
|---public - document root
|   |
|   |----index.php
|
|
|---views
|   |
|   |----notes
|   |        |---create.php
|   |        |---index.php
|   |        |---show.php
|   |
|   |
|   |----partials
|   |        |---banner.php
|   |        |---footer.php
|   |        |---header.php
|   |        |---nav.php
|   |
|   |
|   |---403.php
|   |---404.php
|   |---about.php
|   |---contact.php
|   |---index.php
|
|
|---.htaccess
|---config.php
|---routes.php

Точка входа в приложение — project_root/public/index.php

Код: Выделить всё

const BASE_PATH = __DIR__.'/../';

// var_dump(BASE_PATH); // "C:\xampp\htdocs\project_root\public/../"

require BASE_PATH.'Core/functions.php';

// php calls this function automatically when a class is required
spl_autoload_register(function ($class) {

require base_path("Core/" . $class . '.php');
});

// appends BASE_PATH to the given path
require base_path('Core/router.php');
У меня есть несколько вспомогательных функций в Core/functions.php, в том числе

Код: Выделить всё

function base_path($path)
{
// append BASE_PATH so we don't have to remember what the path is
return BASE_PATH . $path; // const BASE_PATH = __DIR__.'/../'
}
и у меня есть очень простой маршрутизатор, который находится в project_root/Core/router.php:

Код: Выделить всё

function routeToController($uri, $routes) {

if (array_key_exists($uri, $routes)) {
require base_path($routes[$uri]);
} else {
abort();
}
}

function abort($code = 404) {
http_response_code($code);

require base_path("views/{$code}.php");

die();
}

$routes = require base_path('routes.php');

$uri = parse_url($_SERVER['REQUEST_URI'])['path'];

routeToController($uri, $routes);
с маршрутами, установленными в project_root/routes.php

Код: Выделить всё

return [
'/' => 'controllers/index.php',
'/about' => 'controllers/about.php',
'/notes' => 'controllers/notes/index.php',
'/note' => 'controllers/notes/show.php',
'/notes/create' => 'controllers/notes/create.php',
'/contact' => 'controllers/contact.php',
];
который сопоставляет запросы соответствующему контроллеру. (Контроллеры содержат только вспомогательную функцию view(), которая принимает путь и атрибуты для установки переменной заголовка.)
Когда я начинаю локальный сервер разработки с помощью команды php -S localhost:8888 -t public все работает как положено, и я могу нажимать ссылки на главную страницу о заметках и контактах для отображения соответствующего документа.
На общем сервере я пробовал разные правила .htaccess, и лучшее, что у меня получилось:

Код: Выделить всё

RewriteEngine On

RewriteCond %{REQUEST_URI} !^/public/

RewriteRule ^$ /public/$1
При этом успешно запускается project_root/public/index.php, который, в свою очередь, загружает контроллер project_root/controllers/index.php, который вызывает project_root/views/index. php:

Код: Выделить всё

// project_root/views/index.php

// import partials:






Hello. Welcome to the home page.




Все части успешно загружаются, но когда я нажимаю ссылку на любую другую страницу (, заметки или контакты) Я получаю страницу 404.
Когда я смотрю на сетевой монитор браузера и нажимаю кнопку «О программе» link я получаю следующий метод, имя файла и статус:

Код: Выделить всё

GET

filename /about
Status 302 Found
Когда главная страница загружается или я нажимаю на главную ссылку, я получаю:

Код: Выделить всё

GET

filename /
Status 200 OK
Что мне нужно сделать, чтобы другие страницы загрузились? Я часами просматривал документы на .htaccess, включая документы Apache, но все это настолько ускользает от меня, что я действительно не понимаю, что делаю. Дайте мне год или около того и, возможно....! Но я действительно сейчас застрял, и буду очень признателен за любую помощь.
Заранее спасибо, если вы сможете мне помочь. Кажется, это распространенная проблема, с которой сталкиваются люди, но мне еще предстоит найти успешное решение. Возможно ли вообще добиться того, чего я хочу, используя правила .htaccess?

Подробнее здесь: https://stackoverflow.com/questions/792 ... the-docume
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»