все маршруты указывают на /

У меня есть приложение Javascript, которое использует Slim (slimframework.com) в качестве конечной точки API.

Я использовал это довольно долго на своем предыдущем компьютере (win 8), но переместил его, и теперь он работает на OSX (Apache 2.4.9 php 5.5).

Странно то, что после этой миграции, какие бы маршруты GET я ни пробовал, все они направляются в / (маршрут по умолчанию). когда я пытаюсь получить путь запроса (как вы можете видеть в маршруте «/»), он показывает правильный запрос.

Я разобрал все это и настроил самый минимальный макет. Те же результаты.

php:

require 'Slim/Slim.php';

\Slim\Slim::registerAutoloader();

$app = new \Slim\Slim();

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

$app->get('/', function () use ($app) {
    echo "root" . $app->request()->getPath();
});

$app->run();

Вызов /hello/world должен вернуть строку "Hello, world". Но вместо этого он возвращает «root /hello/world/», обратите внимание на косую черту в конце. Это относится и к любому другому маршруту (например, /hello/world/and/other/planets/as/well возвращает "корень/привет/мир/и/другие/планеты/а/а/").

Мне интересно, имеет ли это какое-то отношение к моей конфигурации виртуального хоста (но у меня есть много приложений, которые используют перезапись URL-адресов, и это, похоже, работает)

httpd-vhost.conf

<VirtualHost *:80>
  ServerName stage_api.loc
  ServerAlias stage_api.loc
  DocumentRoot "[the correct dir]"

  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule (.*) /index.php [L,QSA]

  <Directory "[the correct dir]">
    Options Indexes FollowSymlinks MultiViews
    AllowOverride All
    Require all granted
  </Directory>

</VirtualHost>

Странно то, что если я опускаю FollowSymLinks из конфигурации виртуального хоста, все это терпит неудачу.

Что-то мне здесь не хватает? Любая помощь приветствуется.

B

ОБНОВЛЕНИЕ: опасаясь, что это будет выглядеть как легкое обсессивно-компульсивное расстройство... но я добавил print_r($_SERVER); в index.php, и все кажется правильным

Array
(
    [SCRIPT_URL] => /hello/world
    [SCRIPT_URI] => http://stage_api.loc/hello/world
    [HTTP_HOST] => stage_api.loc
    [HTTP_CONNECTION] => keep-alive
    [HTTP_CACHE_CONTROL] => no-cache
    [HTTP_USER_AGENT] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36
    [HTTP_ACCEPT] => */*
    [HTTP_ACCEPT_ENCODING] => gzip, deflate, sdch
    [HTTP_ACCEPT_LANGUAGE] => en,en-US;q=0.8,nb;q=0.6
    [PATH] => [removed by user]
    [SERVER_SIGNATURE] => 
    [SERVER_SOFTWARE] => Apache/2.4.9 (Unix) OpenSSL/0.9.8za PHP/5.5.14
    [SERVER_NAME] => stage_api.loc
    [SERVER_ADDR] => 127.0.0.1
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 127.0.0.1
    [DOCUMENT_ROOT] => [removed by user]
    [REQUEST_SCHEME] => http
    [CONTEXT_PREFIX] => 
    [CONTEXT_DOCUMENT_ROOT] => [removed by user]
    [SERVER_ADMIN] => [email protected]
    [SCRIPT_FILENAME] => [removed by user]/index.php
    [REMOTE_PORT] => [removed by user]
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => 
    [REQUEST_URI] => /hello/world
    [SCRIPT_NAME] => /hello/world
    [PHP_SELF] => /hello/world
    [REQUEST_TIME_FLOAT] => 1421675412.017
    [REQUEST_TIME] => 1421675412
    [argv] => Array
        (
        )

    [argc] => 0
)

person Bard Rotzer    schedule 19.01.2015    source источник


Ответы (1)


Так. Используя Stackoverflow в качестве резиновой утки, я в конце концов придумал своего рода решение (если кто-то наткнется на ту же проблему).

Среда неправильно интерпретируется в Slim framework при использовании переписанного URL-адреса.

Пришлось переопределить настройку свойства в Environment.php (строка 143)

from:
  $env['PATH_INFO'] = substr_replace($requestUri, '', 0, strlen($physicalPath));
to: 
  $env['PATH_INFO'] = $_SERVER['REQUEST_URI'];

Это, конечно, не идеально. Но заставляет меня работать, пока я нахожу лучший способ определить, переписан ли URL-адрес или нет.

person Bard Rotzer    schedule 20.01.2015