uk / routing
小型UniKado URL路由库。
Requires
- php: >=7.0
- uk/core.errors: ^0.1.1
- uk/dynamic-properties: ^0.2.0
This package is not auto-updated.
Last update: 2024-09-14 18:58:47 UTC
README
简单的URL路由库。
安装
通过composer安装它!
composer require uk/routing
或者在你的composer.json中包含它
{ "require": { "php": ">=7.0", "uk/routing": "^0.1.3" } }
准备Web服务器
对于Router的使用,你需要告诉Web服务器,它应该将请求重写到不存在的URL路径到处理PHP脚本。
你可以通过两种不同的方式来做这件事
- 将不存在的URL路径作为具有特定名称的
GET
变量传递到脚本中 - 通过
$_SERVER[ 'REQUEST_URI' ]
传递不存在的URL路径(最佳选择)
Apache Web服务器
对于Apache来说,处理重写非常简单。
创建一个名为.htaccess
的文件,并将其放置在需要重写工作的文件夹中。
但请注意!
.htaccess(分布式配置文件)应仅在没有访问服务器配置文件的情况下使用。
.htaccess的使用会带来一些开销,可以避免。
但如果您承认一个服务器,就没有必要再向您展示更多了。您必须知道它 :-)
此文件的内容取决于应使用的路由器类型。
作为GET变量(RouterType::REWRITE_TO_GET)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?theURL=$1 [QSA,L]
第一行启用重写引擎。第二行声明匹配所有不存在的文件调用条件,第三行匹配所有不存在的目录调用。
最后一行将匹配的调用重写到不存在的文件和目录到index.php
,并将调用的不存在的URL路径传递到theURL
GET变量
作为'REQUEST_URI'值(RouterType::REWRITE_TO_REQUEST_URI)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
第一行启用重写引擎。第二行声明匹配所有不存在的文件调用条件,第三行匹配所有不存在的目录调用。
最后一行将匹配的调用重写到不存在的文件和目录到index.php
,并将调用的不存在的URL路径传递到$_SERVER[ 'REQUEST_URI' ]
错误处理
如果.htaccess的使用引发了某些服务器错误(例如,错误50*或其他),你必须检查
- Apache是否启用了使用.htaccess文件
- Apache是否启用了通过.htaccess文件进行重写(.htaccess文件的权限)
- Apache是否启用了mod_rewrite扩展
前两个可以通过确保AllowOverwrite指令来处理。有关详细信息,请参阅:Apache HTTP服务器教程:.htaccess文件
AllowOverride FileInfo
要检查是否启用了mod rewrite,请在您的控制台中调用此命令
sudo a2enmod rewrite
如果已经启用,它将输出:Module rewrite already enabled
如果没有启用,则启用重写模块。
如果您无法访问服务器上的控制台,请联系管理员或提供商,并询问是否已为您启用mod_rewrite。如果没有,请让他们通过.htaccess启用mod_rewrite的使用
NGINX Web服务器
这是一个大的TODO!:-)
但我想如果你使用
try_files $uri $uri/ /index.php?$args;
……它应该可以通过$_SERVER[ 'REQUEST_URI' ]
在index.php
中获取到调用URL路径
使用方法
// Include the autoloader, created by composer require __DIR__ . '/vendor/autoload.php'; use UK\Routing\Router; use UK\Routing\RouterType; // Init the router $router = new Router( // The type of the router RouterType::REWRITE_TO_REQUEST_URI ); // Adds an dynamic regex URI path route $router->addRoute( '~^/foo/(\d+)/bar/?$~', function ( array $matches ) { // If you need access to current Router instance can get it by Router::GetInstance() echo 'ID: ', $matches[ 1 ], ' OK :-)'; exit; } ); // Adds an static URI path route $router->addRoute( '~^/baz/?$~', function () { // If you need access to current Router instance can get it by Router::GetInstance() echo 'The BAZ is called!'; exit; } );
在定义你的路由后,你只需调用execute(),然后路由就会被执行。
if ( ! $router->execute() ) { // Showing 404 error because no router matches the defined request URI path. }