PHP - 路由在子文件夹站点中不起作用
PHP - Routing not working in subfolder sites
我正在尝试创建一个 php 项目。在路由时,url 路由与虚拟主机域完美配合。但是当我将我的项目放在子文件夹中时,该功能无法正常工作。我的路由器 Class 看起来像
class Router{
private $request;
public function __construct($request){
$this->request = $request;
}
public function get($route, $file){
$uri = trim( $this->request, "/" );
$uri = explode("/", $uri);
if (empty($uri[0])) {
$file['platform'] = '';
$file['controller'] = 'Index';
$file['action'] = 'index';
}
if($uri[0] == trim($route, "/")){
define("PLATFORM", isset($file['platform']) ? $file['platform'] : '');
define("CONTROLLER", isset($file['controller']) ? $file['controller'] : 'Index');
define("ACTION", isset($file['action']) ? $file['action'] : 'index');
$plarform = !empty(PLATFORM)? PLATFORM . DS: '';
define("CURRENT_CONTROLLER", CONTROLLER_PATH . $plarform);
define("CURRENT_VIEW", VIEW_PATH . PLATFORM . DS);
}
}
}
并像
一样初始化函数
require CORE_PATH.'Router.php';
$request = $_SERVER['REQUEST_URI'];
$router = new Router($request);
但在
中同样有效
http://www.mysite.local
、http://www.mysite.local/about
、http://www.mysite.local/contact
这是一个虚拟主机。
但是当我调用
http://localhost/mysite/
、http://localhost/mysite/about
、http://localhost/mysite/contact
它没有像我预期的那样工作。请给我任何想法来解决这个问题。
我的 .htaccess
如下所示。
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/ [L]
</IfModule>
我已经尝试过
RewriteBase /mysite
是的,经过努力,我终于找到了解决方案。
我刚刚将 $_SERVER['REQUEST_URI'];
更改为 $SERVER['PHP_SELF'];
。
$SERVER['PHP_SELF'];
中有一个index.php
。
也就是说如果 URL 是 http://www.mysite.local/about
实际 PHP_SELF
是
http://www.mysite.local/index.php/about
同
http://localhost/mysite/index.php/about
所以我只是用 index.php
展开 siteurl,如下所示。
require CORE_PATH.'Router.php';
$request = $_SERVER['PHP_SELF'];
$requesturi = explode('index.php', $request);
unset($requesturi[0]);
$request = implode($requesturi);
$router = new Router($request);
我正在尝试创建一个 php 项目。在路由时,url 路由与虚拟主机域完美配合。但是当我将我的项目放在子文件夹中时,该功能无法正常工作。我的路由器 Class 看起来像
class Router{
private $request;
public function __construct($request){
$this->request = $request;
}
public function get($route, $file){
$uri = trim( $this->request, "/" );
$uri = explode("/", $uri);
if (empty($uri[0])) {
$file['platform'] = '';
$file['controller'] = 'Index';
$file['action'] = 'index';
}
if($uri[0] == trim($route, "/")){
define("PLATFORM", isset($file['platform']) ? $file['platform'] : '');
define("CONTROLLER", isset($file['controller']) ? $file['controller'] : 'Index');
define("ACTION", isset($file['action']) ? $file['action'] : 'index');
$plarform = !empty(PLATFORM)? PLATFORM . DS: '';
define("CURRENT_CONTROLLER", CONTROLLER_PATH . $plarform);
define("CURRENT_VIEW", VIEW_PATH . PLATFORM . DS);
}
}
}
并像
一样初始化函数require CORE_PATH.'Router.php';
$request = $_SERVER['REQUEST_URI'];
$router = new Router($request);
但在
中同样有效http://www.mysite.local
、http://www.mysite.local/about
、http://www.mysite.local/contact
这是一个虚拟主机。
但是当我调用
http://localhost/mysite/
、http://localhost/mysite/about
、http://localhost/mysite/contact
它没有像我预期的那样工作。请给我任何想法来解决这个问题。
我的 .htaccess
如下所示。
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/ [L]
</IfModule>
我已经尝试过
RewriteBase /mysite
是的,经过努力,我终于找到了解决方案。
我刚刚将 $_SERVER['REQUEST_URI'];
更改为 $SERVER['PHP_SELF'];
。
$SERVER['PHP_SELF'];
中有一个index.php
。
也就是说如果 URL 是 http://www.mysite.local/about
实际 PHP_SELF
是
http://www.mysite.local/index.php/about
同
http://localhost/mysite/index.php/about
所以我只是用 index.php
展开 siteurl,如下所示。
require CORE_PATH.'Router.php';
$request = $_SERVER['PHP_SELF'];
$requesturi = explode('index.php', $request);
unset($requesturi[0]);
$request = implode($requesturi);
$router = new Router($request);