Ваша проблема напрямую связана с тем, как вы используете встроенный веб-сервер PHP.
Как указано в PHP документах , вот как сервер обрабатывает запросы:
URI-запросы поступают из текущего рабочего каталога, где был запущен PHP, если только опция -t не используется для указания явного корня документа. Если в запросе URI не указан файл, возвращаются либо index.php, либо index.html в данном каталоге. Если ни один из файлов не существует, поиск по index.php и index.html будет продолжаться в родительском каталоге и так далее, пока файл не будет найден или корень документа не будет достигнут. Если index.php или index.html найден, он возвращается, и $ _SERVER ['PATH_INFO'] устанавливается на завершающую часть URI. В противном случае возвращается код ответа 404.
Если при запуске веб-сервера в командной строке указан файл PHP, он рассматривается как сценарий «маршрутизатора». Сценарий запускается в начале каждого HTTP-запроса. Если этот скрипт возвращает FALSE, то запрашиваемый ресурс возвращается как есть. В противном случае вывод скрипта возвращается в браузер.
Это означает, что, по умолчанию (без скрипта маршрутизатора), веб-сервер выполняет довольно хорошую работу по маршрутизации несуществующих URI в корневой файл документа index.php
.
Другими словами, при условии, что ваша файловая структура имеет вид:
lib/
base.php
template.php
etc.
public/
index.php
Для запуска сервера и правильной отправки запросов в среду достаточно следующей команды:
php -S 0.0.0.0:8090 -t public/
Или, если вы запускаете команду прямо из общедоступной / папки:
cd public
php -S 0.0.0.0:8090
Помните, что рабочий каталог вашего приложения зависит от папки, из которой вы вызываете команду. Чтобы использовать это значение, я настоятельно рекомендую вам добавить chdir(__DIR__);
вверху вашего public/index.php
файла. Таким образом, все последующие вызовы require
будут относиться к вашей папке public/
. Например: $f3 = require('../lib/base.php');
Маршрутизация URI в стиле файла
Встроенный сервер, по умолчанию , не будет передавать несуществующие file URI на ваш index.php
, как указано в:
Если в запросе URI не указан файл, возвращаются либо index.php, либо index.html в данном каталоге
Так что, если вы планируете определять некоторые маршруты с точками, например:
$f3->route('GET /brew.json','Brew->json');
$f3->route('GET /brew.html','Brew->html');
Тогда это не сработает, потому что PHP не передаст запрос на index.php
.
В этом случае вам необходимо вызвать пользовательский маршрутизатор, например .htrouter.php
, который вы пытались использовать. Единственное, что ваш .htrouter.php
, очевидно, был разработан для другой платформы (F3 не заботится о $_GET['url']
, но заботится о $_SERVER['SCRIPT_NAME']
.
Вот пример .htrouter.php
, который должен работать с F3:
// public directory definition
$public_dir=__DIR__.'/public';
// serve existing files as-is
if (file_exists($public_dir.$_SERVER['REQUEST_URI']))
return FALSE;
// patch SCRIPT_NAME and pass the request to index.php
$_SERVER['SCRIPT_NAME']='index.php';
require($public_dir.'/index.php');
Примечание: переменная $public_dir
должна быть установлена в соответствии с расположением файла .htrouter.php
.
Например, если вы звоните:
php -S 0.0.0.0:8090 -t public/ .htrouter.php
должно быть $public_dir=__DIR__.'/public'
.
Но если вы позвоните:
cd public
php -S 0.0.0.0:8090 .htrouter.php
должно быть $public_dir=__DIR__
.