我正在学习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开头。
有任何解释和/或建议,或者这是有效的解决方案?
答案 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>
现在可以识别路线了。