Проблемы маршрутизации с Slim Framework, работающим на AppFog

Я успешно запускал приложения Slim на нескольких разных серверах и сегодня пытался настроить одно из них на AppFog, используя ту же структуру, но оно не работает нормально.

Я начну со своей структуры каталогов:

.htaccess
/public
    .htaccess
    index.php
    /routes
/Slim

Файл root .htaccess содержит код DocumentRoot из документации AppFog.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^brs.aws.af.cm$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www.brs.aws.af.cm$
RewriteCond %{REQUEST_URI} !public/
RewriteRule (.*) /public/$1 [L]

Каталог /public — это место, где будет находиться мой код API, а также файлы Slim index.php и .htaccess. Файл index.php содержит два простых маршрута:

require '../Slim/Slim.php';

\Slim\Slim::registerAutoloader();

$app = new \Slim\Slim();


// Default GET route
$app->get('/', function () {
    echo "Default GET route";
});


// Hello World route
$app->get('/hello/:name', function ($name) {
    echo "Hello, $name";
});


$app->run();

Сервер настроен по адресу http://brs.aws.af.cm/, и я перечислил основные маршруты ниже:

  1. / => использует маршрут GET по умолчанию
  2. /привет/джон => Ошибка 404
  3. /public/hello/john => работает, но требует "/public" в URL

А вот и лишняя странность. Маршруты из семи символов приводят к ошибке 404, шесть или меньше заканчиваются использованием маршрута GET по умолчанию.

  1. /123456 => не должно работать, но использует маршрут GET по умолчанию
  2. /1234567 => ошибка 404

Я совершенно озадачен. Я полагаю, что это как-то связано с кодом DocumentRoot, но я не уверен, что именно. Я также пытался установить

RewriteBase /public/

в /public/.htaccess, но, похоже, это ни на что не влияет.

Любая помощь будет принята с благодарностью. Спасибо!


person brad    schedule 15.03.2013    source источник
comment
Я не знаком с AppFog, но пробовали ли вы удалить свой корневой файл .htaccess и включить те, которые находятся в общем каталоге .htaccess? Также устраняется общедоступное правило RewriteRule и переписывается на index.php/$1.   -  person gmartellino    schedule 16.03.2013
comment
@GaryM Спасибо. Я попробовал ваши предложения, однако каталог root технически является корневым веб-сайтом, поэтому я считаю, что первый файл .htaccess необходим для фактического перенаправления в каталог /public/.   -  person brad    schedule 16.03.2013
comment
У меня такая же проблема с AppFog. Вы нашли решение ?   -  person Moshe Marciano    schedule 19.06.2013
comment
Любое решение этого также   -  person Ian Warner    schedule 05.07.2013


Ответы (1)


В фреймворке Slim PHP есть ошибка в строке 143 Environment.php. В частности, предполагается, что путь $_SERVER['SCRIPT_NAME'] совместим с переменной $_SERVER['REQUEST_URI']. В большинстве случаев это, вероятно, верно, но не при использовании MOD_REWRITE для сокрытия промежуточного каталога (как это происходит в указанном вами .htaccess).

Происходит следующее: $_SERVER['SCRIPT_NAME'] выглядит примерно как "/public/something...", но (поскольку оно скрыто) $_SERVER['REQUEST_URI'] выглядит как "/something...".

Слим предполагает, что URI запроса основан на имени скрипта, что здесь не так. Я планирую уведомить авторов Slim об ошибке, но хотел бы отметить это и здесь.

Вы можете исправить/обойти это, изменив строку 143 Slim/Environment.php на это:

if (strpos($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']) === 0) {
    $env['SCRIPT_NAME'] = $_SERVER['SCRIPT_NAME']; //Without URL rewrite
    $env['PATH_INFO'] = substr_replace($_SERVER['REQUEST_URI'], '', 0, strlen($env['SCRIPT_NAME']));
} else {
    $env['SCRIPT_NAME'] = str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'])); //With URL rewrite
    $env['PATH_INFO'] = $_SERVER['REQUEST_URI'];
}
// $env['PATH_INFO'] = substr_replace($_SERVER['REQUEST_URI'], '', 0, strlen($env['SCRIPT_NAME']));

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

person devios1    schedule 12.10.2013
comment
К вашему сведению, похоже, что кто-то уже сообщил об этой проблеме: github.com/codeguy/Slim/issues/521 - person devios1; 13.10.2013
comment
это действительно полезно, спасибо. Вы не совсем охватываете некоторые крайние случаи, которые я добавил на github, но они тривиальны (если вы общедоступны, но не index.php или наоборот). - person user1616353; 31.10.2013
comment
Это решение не работает для меня, я использую этот хак, но я думаю, что должен быть лучший способ: help.slimframework.com/discussions/problems/ - person Rodrigo Polo; 14.10.2014