了解$ _SERVER [REQUEST_URI]

时间:2019-02-05 00:33:53

标签: php

我正在学习LARACAST PHP实践者类,但是$ _SERVER [REQUEST_URI]有问题。

如果我在浏览器中写URL:localhost/laracast/about,并且在router->中仅定义'laracast' => 'controllers/index.php'或在laracast /之后的其他页面(索引除外),它总是返回404。我必须将其更改为localhost/laracast/index.php/about才能使它及其他页面正常工作。我整天都在弄清楚这个问题,但我仍然不明白为什么如果我在路由中省略index.php而不是404错误,为什么它根本不会引发在类中声明的异常。服务器上有东西吗?

代码如下:

routes.php

$router->define([

'laracast/index.php' => 'controllers/index.php',
'laracast/index.php/about' => 'controllers/about.php',
'laracast/index.php/about/culture' => 'controllers/about-culture.php',
'laracast/index.php/contact' => 'controllers/contact.php']);

路由器类

class Router
{

    private $routes = [];

    public function define($routes){
        $this->routes = $routes;
    }

    public static function load($file){

        $router = new static;
        require $file;
        return $router;
    }


    public function direct($uri)

    {

        if(array_key_exists($uri, $this->routes)){

            return $this->routes[$uri];
        }

        throw new Exception("No route defined for this URI");

    }

}

和index.php

<?php 

$query = require 'core/bootstrap.php';

$uri = trim($_SERVER['REQUEST_URI'], '/');

require Router::load('routes.php')

        ->direct($uri);

使用该URL http://localhost/laracast/index.php/about可以正常工作,所有其他页面都以index.php开头。 有任何解释和/或建议,或者这是有效的解决方案?

1 个答案:

答案 0 :(得分:0)

感谢@Martin Zeitler的指示,并进行了一些研究,使之有效。在.htaccess文件中,我刚刚添加了这段代码。

<IfModule mod_rewrite.c>
    RewriteEngine On
    Options +FollowSymLinks -Indexes

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

现在可以识别路线了。