Php Slim框架下的路由问题

Php Slim框架下的路由问题,php,url-routing,slim,Php,Url Routing,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 () {

我刚从斯利姆开始。我目前的申请如下:

<?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上运行它。对于我在浏览器、邮递员或CURL中尝试的每一个请求,我得到的总是helloworld,好像没有考虑第一条路线。此外,如果我删除第二条路线,我总是得到一个404

我忘了什么吗


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

无法删除第二个路由$app->get'/',因为它是主默认路由,获取404是很正常的,因为$app->get'/:name',函数$name{}需要一个缺少的回调函数参数'name'

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

http://localhost/mysite/  --- Outputs Hello World
http://localhost/mysite/marcosh  --- Outputs a 404 ??
如果是这种情况,那么正如a77icus5建议的那样,我们可能需要查看您的htacess文件,以及项目目录结构是什么

我有一个新的安装,我想我会与你分享我的配置

我的Web项目目录如下:

Webroot
-htaccess
- public
-- htaccess
-- assets
--- js
--- css
- templates
- app
- vendor
-- Slim
-- Twig
  // 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
在项目根目录中的第一个.htaccess中,我添加了:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
<IfModule mod_php5.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^ index.php [QSA,L]
</IfModule>
然后在SLIM->Environment.php第142行-虚拟路径中,尝试如下编辑:

Webroot
-htaccess
- public
-- htaccess
-- assets
--- js
--- css
- templates
- app
- vendor
-- Slim
-- Twig
  // 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

无法删除第二个路由$app->get'/',因为它是主默认路由,获取404是很正常的,因为$app->get'/:name',函数$name{}需要一个缺少的回调函数参数'name'

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

http://localhost/mysite/  --- Outputs Hello World
http://localhost/mysite/marcosh  --- Outputs a 404 ??
如果是这种情况,那么正如a77icus5建议的那样,我们可能需要查看您的htacess文件,以及项目目录结构是什么

我有一个新的安装,我想我会与你分享我的配置

我的Web项目目录如下:

Webroot
-htaccess
- public
-- htaccess
-- assets
--- js
--- css
- templates
- app
- vendor
-- Slim
-- Twig
  // 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
在项目根目录中的第一个.htaccess中,我添加了:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
<IfModule mod_php5.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^ index.php [QSA,L]
</IfModule>
然后在SLIM->Environment.php第142行-虚拟路径中,尝试如下编辑:

Webroot
-htaccess
- public
-- htaccess
-- assets
--- js
--- css
- templates
- app
- vendor
-- Slim
-- Twig
  // 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 Web服务器,所以不能使用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";
}

您需要某种url重写才能使Slim正常工作。因为您使用的是内部PHP Web服务器,所以不能使用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 public/index.php从项目的主文件夹启动应用程序,这导致无法编译HTTP请求的PATH_INFO头


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

最终,我发现问题是由错误的文档根给出的

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


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

是的,您可以共享您的web项目结构和.htaccess文件吗?当前项目是细长骨架吗?我没有使用细长骨架。My index.php位于公用文件夹中。我使用的是PHP内置的web服务器,所以我没有.htaccess文件是的,你能分享你的web项目结构和.htaccess文件吗?当前项目是细长骨架吗?我没有使用细长骨架。My index.php位于公用文件夹中。我使用的是PHP内置的web服务器,所以我没有.htaccess文件。我尝试过你的方法,但没有结果。有了/foo,我得到了hello world,有了/I,我得到了一个404代码。您可能运行了许多Web服务器,但访问了错误的Web服务器。我尝试了您的方法,但没有结果。有了/foo,我得到了hello world,有了/I,我得到了一个404代码。您可能运行了许多Web服务器,但访问了错误的Web服务器。