Я только что начал с Slim. Мое приложение на данный момент выглядит примерно так:
<?php require 'vendor/autoload.php'; $app = new \Slim\Slim([ 'debug' => true ]); var_dump($app->request()); $app->get('/:name', function ($name) { echo "Hello, $name"; }); $app->get('/', function () { echo 'hello world'; }); $app->run();
Я запускаю его на localhost, используя PHP, встроенный в веб-сервер. Для каждого запроса, который я пытаюсь использовать в браузере (или Postman, или CURL), я получаю всегда «привет мир», как если бы первый маршрут не рассматривался. Более того, если я удалю второй маршрут, я всегда получаю 404.
Я что-то забыл?
Для целей отладки, какой HTTP-заголовок используется SLIM для определения маршрута?
Вы не можете удалить второй маршрут $app->get('/')
поскольку это маршрут по умолчанию по умолчанию, и вполне нормально получить 404, потому что $app->get('/:name', function ($name) {})
ожидает, что аргумент функции обратного вызова 'name'
отсутствует.
Вы пытаетесь сделать следующее:
http://localhost/mysite/ --- Outputs Hello World http://localhost/mysite/marcosh --- Outputs a 404 ??
Если это так, то, как предположил a77icus5, нам может понадобиться изучить ваш htacess-файл и структуру структуры проекта …
У меня есть новая установка Slim Skeleton, и я решил поделиться с вами своей конфигурацией …
Каталог моего веб-проекта выглядит следующим образом:
Webroot -htaccess - public -- htaccess -- assets --- js --- css - templates - app - vendor -- Slim -- Twig
В первом .htaccess
расположенном в корневом каталоге проекта, я добавил:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule>
Здесь public
соответствует имени общей папки приложения
Затем в .htaccess
расположенном в общей папке, я добавил:
<IfModule mod_php5.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L] </IfModule>
Затем в SLIM -> Environment.php (строка 142 – Виртуальный путь) и попробуйте изменить следующим образом:
// Virtual path // $env['PATH_INFO'] = substr_replace($requestUri, '', 0, strlen($physicalPath)); // <-- Remove physical path $env['PATH_INFO'] = str_replace(str_replace('/public', "", dirname($_SERVER['PHP_SELF'])), '', "/".$requestUri); // remove public from URI $env['PATH_INFO'] = str_replace('?' . $queryString, '', $env['PATH_INFO']); // <-- Remove query string $env['PATH_INFO'] = '/' . ltrim($env['PATH_INFO'], '/'); // <-- Ensure leading slash
Вам нужно какое-то переписывание URL для Slim для работы. Поскольку вы используете внутренний веб-сервер PHP, вы не можете использовать mod_rewrite
. Вместо этого создайте файл route.php
в той же папке, что и index.php
со следующим кодом.
<?php # Used only for running the app with internal PHP webserver # php -S localhost:8080 route.php if (file_exists(__DIR__ . "/" . $_SERVER["REQUEST_URI"])) { return false; } else { include_once "index.php"; }
Затем запустите его с php -S localhost:8080 route.php
. Все работает сейчас, как ожидалось.
$ curl --include http://localhost:8080/foo HTTP/1.1 200 OK Host: localhost:8080 Connection: close X-Powered-By: PHP/5.6.2 Content-type: text/html;charset=UTF-8 Hello, foo
В конце концов, я узнал, что проблема была вызвана неправильным корнем документа.
Я запускал приложение из основной папки моего проекта, используя php -S localhost:8080 public/index.php
и это заставило заголовок PATH_INFO
HTTP-запроса не компилироваться.
Изменение каталога на ./public
и запуск приложения с использованием php -S localhost:8080 index.php
решил проблему