簡體   English   中英

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();

我使用Web服務器內置的PHP在localhost上運行它。 對於我在瀏覽器(或Postman或CURL)中嘗試的每個請求,得到的總是“ hello world”,好像沒有考慮第一條路線。 此外,如果我刪除第二條路線,則總會得到404。

我忘記了什么嗎?

出於調試目的,SLIM使用哪個HTTP標頭確定路由?

您不能刪除第二條路由$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/$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)中,嘗試進行如下編輯:

  // 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標頭無法編譯。

將目錄更改為./public並使用php -S localhost:8080 index.php啟動應用程序解決了該問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM