Webman伪静态需由Nginx/Apache统一将请求转发至index.php,框架本身不处理重写;Nginx推荐用try_files $uri $uri/ /index.php?$uri&$args,Apache需启用mod_rewrite并配置含!-f和!-d判断的.htaccess,root必须指向public目录,路由匹配严格依赖定义顺序。

Webman 默认不内置 URL 重写模块,伪静态必须靠 Web 服务器(Nginx/Apache)配合 index.php 入口统一接管请求来实现——它本身不处理 rewrite 规则,也不解析路径参数,所有路由逻辑由框架的 Route 类或中间件完成。
Webman 的伪静态本质是“前端路由透传”
和 Laravel 或 ThinkPHP 不同,Webman 没有类似 public/index.php 自动 fallback 的默认重写逻辑。它的伪静态完全依赖外部服务器把非资源文件(如 /article/123)全部转发给 index.php,再由 Webman 的路由系统匹配。
这意味着:
- Webman 本身不生成 .htaccess 或 nginx.conf;你得自己写、自己部署、自己验证
- 所有“伪静态效果”都发生在
index.php被调用之后,框架只看到$_SERVER['REQUEST_URI']原始路径 - 如果 Nginx 把
/css/app.css也转发给了index.php,而你又没在路由里排除静态资源,就会 404 或白屏
Nginx 下必须用 try_files + 正确的 root 配置
常见错误是直接复制 Laravel 的 try_files $uri $uri/ /index.php?$query_string,但 Webman 不依赖 QUERY_STRING 传参,$args 反而可能污染原始路径。
推荐配置(放在 location / 块内):
location / {
try_files $uri $uri/ /index.php?$uri&$args;
}
关键点:
-
try_files $uri $uri/优先尝试真实文件/目录,避免 PHP 处理静态资源 -
/index.php?$uri把原始路径作为 query 参数传入,Webman 的Request对象能通过$request->getUri()正确还原 - 不要用
$query_string,它会把原有参数重复拼接,导致parse_url()解析错乱 -
root必须指向 Webman 项目的public目录,不是项目根目录
Apache 的 .htaccess 必须启用 mod_rewrite 且禁用 MultiViews
Webman 官方未提供标准 .htaccess 模板,直接套用 WordPress 的规则会出问题——因为 WordPress 用 PATH_INFO,而 Webman 默认读 REQUEST_URI。
最小可用配置(放在 public/.htaccess):
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
注意:
-
Options -MultiViews必须显式关闭,否则 Apache 可能自动匹配index.php导致无限重定向 -
RewriteCond判断的是物理路径,不是路由路径;!-f和!-d缺一不可 -
[QSA]保留原始查询参数,[L]确保终止后续规则 - 如果使用宝塔面板,需确认“伪静态”选项选的是“纯静态”或“手动”,不能选“WordPress”模板
SEO 友好 URL 要在 Route 定义阶段就设计好
Webman 的路由是硬编码在 config/route.php 或通过 Route::get() 注册的,没有运行时动态解析机制。所谓“自定义 SEO URL”,本质是提前约定路径结构,并确保它和前端链接、后台生成逻辑一致。
例如文章页想用 /post/{id}-{slug}.html:
Route::get('/post/{id}-{slug}.html', [App\Controller\ArticleController::class, 'show']);
这样做的代价和注意事项:
- URL 中的
{slug}是纯装饰,Webman 不校验它是否匹配数据库内容;你要在控制器里自己查$id并比对$slug,不一致就 301 跳转到正确地址 - 生成链接时不能只拼
/post/123-title.html,要调用url()辅助函数或构建器,否则改规则后全站链接失效 - 如果启用了缓存,
{slug}改变后旧 URL 仍可访问,需在更新文章时主动清除对应缓存键 - 搜索引擎收录的
.html后缀只是视觉友好,Webman 不强制后缀;去掉后缀也能匹配,但建议保持统一
真正容易被忽略的点:Webman 的路由匹配顺序是「从上到下」,一旦前面的模糊规则(比如 /user/*)挡住了后面更具体的(比如 /user/login),就永远匹配不到——这种错位不会报错,只会静默 404。


















