【问题标题】:Routing issue with Slim frameworkSlim 框架的路由问题
【发布时间】:2015-06-18 03:15:01
【问题描述】:

我刚开始使用 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();

我使用 PHP 内置的 web 服务器在 localhost 上运行它。对于我在浏览器(或 Postman 或 CURL)中尝试的每个请求,我得到的始终是“hello world”,好像没有考虑第一个路由。此外,如果我删除第二条路线,我总是会得到 404。

我是不是忘记了什么?

出于调试目的,SLIM 使用哪个 HTTP 标头来确定路由?

【问题讨论】:

  • 是的,您能分享一下您的 Web 项目结构和 .htaccess 文件吗?当前项目是 Slim 骨架吗?
  • 我没有使用 Slim 骨架。我的 index.php 在公共文件夹中。我使用的是 PHP 内置的 web 服务器,所以我没有 .htaccess 文件

标签: php url-routing slim


【解决方案1】:

您不能删除第二条路由 $app-&gt;get('/'),因为它是 Home 默认路由,并且得到 404 是很正常的,因为 $app-&gt;get('/:name', function ($name) {}) 期望回调函数的参数 'name' 丢失。

您是否正在尝试以下操作:

http://localhost/mysite/  --- Outputs Hello World
http://localhost/mysite/marcosh  --- Outputs a 404 ??

如果是这种情况,那么正如 a77icus5 建议的那样,我们可能需要查看您的 htacess 文件以及项目目录结构是什么...

我有一个全新的Slim Skeleton 安装,我想我会与您分享我的配置...

我的Web项目目录如下:

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

【讨论】:

    【解决方案2】:

    最终,我发现问题是由错误的文档根引起的。

    我使用 php -S localhost:8080 public/index.php 从项目的主文件夹启动应用程序,这导致 HTTP 请求的 PATH_INFO 标头未编译。

    将目录更改为./public 并使用php -S localhost:8080 index.php 启动应用程序解决了问题

    【讨论】:

      【解决方案3】:

      您需要对 Slim 进行某种 url 重写才能正常工作。由于您使用的是内部 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
      

      【讨论】:

      • 我试过你的方法,但没有结果。使用 /foo,我得到 hello world,使用 / 我得到 404
      • 代码对我有用。您可能正在运行许多网络服务器并访问了错误的网络服务器。
      猜你喜欢
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 2016-06-28
      • 2014-08-27
      • 1970-01-01
      相关资源
      最近更新 更多