Slim 框架的路由问题
Routing issue with Slim framework
我刚开始使用 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 内置网络服务器。对于我在浏览器(或 Postman,或 CURL)中尝试的每个请求,我得到的总是 "hello world",就好像没有考虑第一条路线一样。此外,如果我删除第二条路线,我总是会得到 404。
我是不是忘记了什么?
出于调试目的,SLIM 使用哪个 HTTP header 来确定路由?
您不能删除第二条路由 $app->get('/')
,因为它是 Home 默认路由,得到 404 是很正常的,因为 $app->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/ [L]
</IfModule>
这里 public
匹配应用 public 文件夹的名称
然后在位于 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
您需要某种 url 重写 Slim 才能工作。由于您使用的是内部 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
最后发现问题出在错误的文档根目录上。
我使用 php -S localhost:8080 public/index.php
从项目的主文件夹启动应用程序,这导致无法编译 HTTP 请求的 PATH_INFO
header。
将目录更改为 ./public
并使用 php -S localhost:8080 index.php
启动应用程序解决了问题
我刚开始使用 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 内置网络服务器。对于我在浏览器(或 Postman,或 CURL)中尝试的每个请求,我得到的总是 "hello world",就好像没有考虑第一条路线一样。此外,如果我删除第二条路线,我总是会得到 404。
我是不是忘记了什么?
出于调试目的,SLIM 使用哪个 HTTP header 来确定路由?
您不能删除第二条路由 $app->get('/')
,因为它是 Home 默认路由,得到 404 是很正常的,因为 $app->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/ [L]
</IfModule>
这里 public
匹配应用 public 文件夹的名称
然后在位于 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
您需要某种 url 重写 Slim 才能工作。由于您使用的是内部 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
最后发现问题出在错误的文档根目录上。
我使用 php -S localhost:8080 public/index.php
从项目的主文件夹启动应用程序,这导致无法编译 HTTP 请求的 PATH_INFO
header。
将目录更改为 ./public
并使用 php -S localhost:8080 index.php
启动应用程序解决了问题