Webman本身不处理URL重写,真正起作用的是Web服务器(如Nginx或Apache);它仅接收重写后的请求,基于$_SERVER['REQUEST_URI']或路由配置进行分发,部署时必须正确配置Nginx的try_files规则或Apache的mod_rewrite与. htaccess,否则将导致404或参数丢失。

Webman 本身不处理 URL 重写,真正起作用的是 Web 服务器(Apache 或 Nginx);Webman 只接收重写后到达的请求,并基于 $_SERVER['REQUEST_URI'] 或路由配置做分发。试图在 Webman 的 PHP 代码里“实现重写”,等于在错的地方修路。
Webman 部署时必须配 Nginx 的 try_files 规则
Webman 默认使用单入口 index.php,Nginx 必须把非静态资源请求全部 fallback 到它,否则直接 404:
location / {
try_files $uri $uri/ /index.php?$query_string;
}-
try_files是核心:它先检查真实文件(如/logo.png)、再查目录,最后才转给index.php - 漏掉
$query_string,原始查询参数(如?ref=home)会丢失 - 如果 Webman 部署在子目录(如
/admin/),location要写成location /admin/,且try_files中的 fallback 路径得是/admin/index.php - 不要套用 Apache 的
.htaccess写法——Nginx 完全不读这个文件,硬搬规则只会 500
Apache 下启用 mod_rewrite 并配好 .htaccess
Webman 在 Apache 上跑,需确保:
-
a2enmod rewrite已执行,且httpd.conf或虚拟主机配置中含:<Directory "/var/www/html"> AllowOverride All Require all granted </Directory> - 项目根目录下
.htaccess文件名必须严格为.htaccess(Windows 下易误存为.htaccess.txt) - 规则必须以
RewriteEngine On开头,否则静默失效
典型规则示例(适配 Webman 单入口):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]-
!-f和!-d防止 CSS/JS 图片被重写导致 404 -
[QSA]保留原始查询字符串,否则$_GET里拿不到ref、utm_source这类参数 -
[L]必须加,否则后续规则可能干扰(比如你后面写了重定向规则,会意外触发)
Webman 路由层如何安全解析重写后的路径
服务器转发后,Webman 的路由逻辑依赖$_SERVER['REQUEST_URI'],不是 $_GET:
- 直接读
$_SERVER['REQUEST_URI'],用parse_url(..., PHP_URL_PATH)提取路径段,再trim($path, '/')去首尾斜杠 - 别用
explode('/', $_SERVER['REQUEST_URI'])—— URL 可能含编码字符(如空格变%20),parse_url才能正确解码 - 若用了 PATH_INFO 模式(如
index.php/user/123),要确认 PHP 配置中cgi.fix_pathinfo=1,否则$_SERVER['PATH_INFO']为空 - Webman 的
Route::get('/user/{id}', ...)是在重写完成之后才生效的,它不参与“URL 到 PHP 脚本”的映射,只管“路径段到控制器方法”的分发
Webman 的 URL 美化成败,80% 取决于 Web 服务器配置是否精准——PHP 层没机会补救 Nginx 少写的 $query_string,也救不了 Apache 里漏掉的 AllowOverride All。动手前先确认 phpinfo() 里能看到 Loaded Modules 含 rewrite,或 Nginx 配置已 nginx -t 校验通过。



















