【问题标题】:all routes point to /所有路线都指向/
【发布时间】:2015-01-19 11:47:50
【问题描述】:

我有一个使用 Slim (slimframework.com) 作为 API 端点的 Javascript 应用程序。

我在以前的计算机(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 返回“root/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] => you@example.com
    [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
)

【问题讨论】:

    标签: php slim


    【解决方案1】:

    所以。使用 Stackoverflow 作为橡皮鸭,我最终想出了各种解决方案(如果有人偶然发现同样的问题)。

    在使用重写的 url 时,Slim 框架中的环境被误解了。

    必须覆盖 Environment.php 中的属性设置(第 143 行)

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

    这当然不理想。但是让我启动并运行,同时找到一种更好的方法来确定 URL 是否被重写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 2018-02-14
      相关资源
      最近更新 更多