在开始路由设置前,需确保Linux系统已安装以下组件:
sudo apt update
sudo apt install nginx
启动Nginx并设置开机自启:
sudo systemctl start nginx
sudo systemctl enable nginx
以Ubuntu为例,安装PHP7.4及常用扩展:
sudo apt install php7.4 php7.4-fpm php7.4-mysql php7.4-curl php7.4-gd
配置PHP-FPM(编辑/etc/php/7.4/fpm/pool.d/www.conf),确保listen指令与Nginx配置一致(如unix:/var/run/php/php7.4-fpm.sock)。
通过Composer创建ThinkPHP项目(以ThinkPHP6为例):
composer create-project topthink/think your_project_name
进入项目目录:
cd your_project_name
ThinkPHP的路由功能依赖PATH_INFO模式,需通过Web服务器配置将动态URL转发至index.php。
创建Nginx配置文件(如/etc/nginx/sites-available/your_project):
sudo nano /etc/nginx/sites-available/your_project
粘贴以下内容(替换your_domain_or_ip和/path/to/your_project):
server {
listen 80;
server_name your_domain_or_ip;
root /path/to/your_project/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 防止访问隐藏文件
location ~ /\. {
deny all;
}
}
启用配置并重启Nginx:
sudo ln -s /etc/nginx/sites-available/your_project /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置语法
sudo systemctl restart nginx
若使用Apache,需启用mod_rewrite模块并创建.htaccess文件(在项目public目录下):
sudo a2enmod rewrite
sudo systemctl restart apache2
.htaccess内容:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [QSA,L]
</IfModule>
ThinkPHP的路由文件位于application/route.php(ThinkPHP6为route/app.php),需引入Route门面并定义规则。
在config/app.php中配置路由开关(ThinkPHP6默认开启):
'url_route_on' => true, // 开启路由
'url_route_must' => false, // 不强制要求所有URL都匹配路由(可选)
在route/app.php中引入Route门面并定义规则:
<?php
use think\facade\Route;
// 首页路由(静态)
Route::get('/', 'index/Index/index');
// 动态路由(带参数)
Route::get('blog/:id', 'blog/read');
// 多级控制器路由
Route::get('admin/user/profile', 'admin.User/profile');
// 路由到闭包(无需控制器)
Route::get('hello/:name', function($name) {
return 'Hello, ' . $name;
});
ThinkPHP提供get、post、put、delete等快捷方法,对应HTTP请求类型:
// GET请求路由
Route::get('blog/:id', 'blog/read');
// POST请求路由(如表单提交)
Route::post('blog/create', 'blog/create');
// 任意请求类型路由(GET/POST/PUT/DELETE)
Route::any('blog/:id', 'blog/read');
[]包裹变量,表示该参数可省略;$结尾,表示URL必须严格匹配规则(无多余字符)。// 可选参数(如博客详情页可选择是否显示评论)
Route::get('blog/:id/[:comment]', 'blog/read');
// 完全匹配(防止URL后追加多余字符)
Route::get('blog/:id$', 'blog/read');
通过->pattern()方法定义变量规则(如限制参数为数字、字母等):
// 全局变量规则(在config/app.php中配置)
'default_route_pattern' => '\w+', // 默认匹配字母、数字、下划线
// 局部变量规则(针对单个路由)
Route::get('blog/:id', 'blog/read')
->pattern(['id' => '\d+']); // 限制id为数字
通过group()方法将相同前缀的路由归为一组,减少重复代码:
// 用户模块路由分组(前缀为'user')
Route::group('user', function() {
Route::get('login', 'user/Login/index');
Route::post('register', 'user/Register/create');
Route::get('profile/:id', 'user/Profile/read');
})->pattern(['id' => '\d+']);
除控制器外,路由还可指向类方法、模板或闭包:
Route::get('blog/:id', '\app\service\Blog@read');
Route::view('hello/:name', 'index/hello', ['city' => 'Shanghai']);
Route::redirect('old-blog/:id', 'new-blog/:id', 301);
完成配置后,通过浏览器或Postman测试路由是否生效:
http://your_domain_or_ip/,应显示首页;http://your_domain_or_ip/blog/1,应调用blog控制器的read方法并传递id=1;http://your_domain_or_ip/hello/world,应显示“Hello, world”。try_files指令和root路径),确保index.php可访问;url_route_on是否开启,路由规则是否正确定义(如变量规则是否匹配);chmod -R 755 /path/to/your_project)。通过以上步骤,即可在Linux环境下完成ThinkPHP路由的配置与使用。根据项目需求,可灵活组合静态路由、动态路由、分组路由等功能,实现简洁、高效的URL管理。