Тонкая структура - не может интерпретировать маршруты с точкой

Постановка задачи

В настоящее время я работаю над внутренним RESTful API и использую наше основное доменное имя в качестве идентификатора среды. Однако я заметил, что Слиму совсем не нравится, когда в маршруте есть точка.

Пример случая

У меня есть локальный веб-сервер, работающий с использованием встроенного веб-сервера PHP, и я вызвал php -S 0.0.0.0:5000, чтобы запустить его.

Как только веб-сервер работает, у меня есть простое «привет, мир» на странице индекса. Все работает отлично и ладно.

Затем я настроил маршрут следующим образом:

$app->get('/:domain/:id', function($domain, $id) 
{
    echo $domain . ' ' . $id;
} 

При этом я настроил маршрут для надеюсь разрешить 0.0.0.0:5000/apple.com/juicers. Я пробовал с 0.0.0.0:5000/apple/juicers, и на странице печатаются соковыжималки для яблок. Но с 0.0.0.0:5000/apple.com/juicers я получаю ошибку 404 Not Found.

Что я пробовал до сих пор

URL переписать

Я искал доступные ресурсы в Google, а также в выпусках Slim framework Github. Кажется, кто-то столкнулся с похожей проблемой: https://github.com/codeguy/Slim/issues/ 359

Предлагаемое решение в этом тикете было следующим: исправление перезаписи URL. Я пробовал это, но безрезультатно. Я установил .htaccess в корне каталога моего проекта и включил AllowOverRide All в файле httpd.conf моего Mac.

php -S 0.0.0.0:5000 index.php

Вместо того, чтобы запускать php -S 0.0.0.0:5000 отдельно, я запустил команду на index.php. На данный момент, вместо того, чтобы выдавать ошибку Not Found, тонкий фреймворк разрешает мой базовый маршрут, который я настроил следующим образом:

$app->get('/', function() { echo "hello world"; });

Спасибо

Я в своем уме, и любая помощь будет высоко оценена. Большое спасибо за чтение!


person Zhia Chong    schedule 20.06.2014    source источник


Ответы (4)


Slim полагается на $_SERVER['SCRIPT_NAME'], который должен быть файлом маршрутизации (DirectoryIndex Apache и файл, на который указывает Rewrite. Допустим, index.php для примера ниже).

На встроенном сервере PHP, если URI содержит точку в файловой части, PHP неправильно позиционирует значение SCRIPT_NAME.

Вы можете использовать следующую настройку, чтобы имитировать поведение RewriteRule:

Создайте файл router.php и отправьте через него все запросы с помощью встроенного сервера PHP:

$_SERVER['SCRIPT_NAME'] = 'index.php';
include 'index.php';

Затем запустите встроенный сервер PHP с помощью:

php -S 0.0.0.0:<port> -t <your-Http-document-root> router.php

Файл router.php не будет использоваться в вашей производственной среде. Его использует только встроенный сервер PHP, и он должен решить вашу проблему «Маршруты с точками».

person Gabriel    schedule 19.08.2015
comment
Одна вещь, о которой стоит упомянуть (выяснилось на собственном горьком опыте), заключается в том, что вам нужно указать файлу router.php обслуживать статические активы, такие как изображения, файлы js и css. Пример № 3 в документации по php показывает следующее: php.net/ manual/ru/ Еще раз спасибо за отличный ответ! - person daggerhart; 12.10.2015

Основная проблема - сервер разработки PHP

Поиграв с различными условиями и экспериментами Slim, я начал присматриваться к уровню сервера и убедиться, что URL-адрес правильно передается на маршруты Slim.

Оказывается, это была проблема с сервером разработки PHP, который доступен через команду php -S.

Быстрый поиск в Google показал, что несколько других столкнулись с той же проблемой, и это была проблема с сервером, а не ошибка в Slim.

Решение

Чтобы проверить свое решение, я запустил MAMP и перенес все свои файлы. Затем я написал .htaccess для перенаправления всех запросов на index.php.

Момент истины:

Я набрал localhost:8888/campaigns/demo.com/12, и волна радости прокатилась по моим венам, когда я увидел строку красивых, великолепных demo.com/12, написанных в браузере! (У меня есть оператор echo для этого конкретного маршрута) Неделя с лишним поиска и устранения неисправностей наконец-то принесла свои плоды!

Праздничное Ура!

\(^O^)/ Ура Apache!

Спасибо за вашу помощь @adosaiguas!

person Zhia Chong    schedule 25.06.2014
comment
Значит проблема со встроенным веб-сервером в php? В апаче нужно условие или сразу работает? - person adosaiguas; 26.06.2014

Я только что добавил это в начало скрипта маршрутизатора (index.php в моем случае):

if (PHP_SAPI === 'cli-server') {
  $_SERVER['SCRIPT_NAME'] = pathinfo(__FILE__, PATHINFO_BASENAME);
}

Пример использования:

$ php -S localhost:8080 -t public index.php
person yanot    schedule 08.08.2018

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

$app->get('/:domain/:id', function($domain, $id) {
    echo $domain . ' ' . $id;
})->conditions(array('domain' => '[a-zA-Z\.]+'));

Если это не сработает, вам следует подумать об использовании другого символа вместо точки, чтобы отделить доменное имя от TLD, а затем заменить его в функции:

$app->get('/:domain/:id', function($domain, $id) {
    $domain = str_replace('_', '.', $domain);
    echo $domain . ' ' . $id;
})->conditions(array('domain' => '[a-zA-Z_]+'));

Это не так элегантно, но работает.

person adosaiguas    schedule 25.06.2014
comment
Я набрал именно то, что вы указали выше, и это результат, который я получил, когда просматривал 0.0.0.0:5000/campaigns/hello.com: The requested resource /campaigns/hello.com was not found on this server. - person Zhia Chong; 26.06.2014
comment
Тогда вы пропустили, чтобы указать id? Вот так: 0.0.0.0:5000/campaigns/hello.com/1 - person adosaiguas; 26.06.2014
comment
Это тоже не сработало. Все та же ошибка: The requested resource /campaigns/hello.com/1 was not found on this server. - person Zhia Chong; 26.06.2014
comment
Я обновил ответ, так как код не компилировался. Также я настроил тестовый проект, и вы правы, условие маршрута не работает. Я думаю, мы можем рассматривать это как ограничение фреймворка или даже как ошибку. Кстати, на SO есть дубликат этого вопроса: stackoverflow.com/questions/18362793/ - person adosaiguas; 26.06.2014