
在 Yii 2 启用 Pretty URL 的项目中,直接使用原生 HTML 表单(非 Yii ActiveForm)时,若 action 属性未正确指向入口脚本,表单会因路由解析失败而默认跳转至首页;需显式指定 index.php 入口文件路径以确保请求被框架正确捕获。
在 yii 2 启用 pretty url 的项目中,直接使用原生 html 表单(非 yii activeform)时,若 `action` 属性未正确指向入口脚本,表单会因路由解析失败而默认跳转至首页;需显式指定 `index.php` 入口文件路径以确保请求被框架正确捕获。
Yii 2 的 Pretty URL 功能依赖 Apache/Nginx 的重写规则(如 .htaccess 或 Nginx 配置),将 /syllabus/lms/index 这类“干净路径”重写为实际的 index.php?r=syllabus%2Flms%2Findex。但该机制仅对 GET 请求生效,且要求所有外部请求最终由 index.php 入口脚本统一处理。
当你在原生 <form> 中设置:
<form action="/syllabus/lms/index" method="post">
浏览器会向服务器发起一个 POST 请求到 /syllabus/lms/index 路径。此时,如果 Web 服务器未对 POST 请求的 Pretty URL 做特殊重写(绝大多数标准配置均不支持 POST 路径重写),服务器会直接尝试查找物理路径 ./syllabus/lms/index —— 显然不存在,于是可能返回 404,或更常见的是被 Yii 2 的默认路由/错误处理逻辑捕获,最终跳转至首页(如 SiteController::actionIndex())。
✅ 正确做法是:显式指向入口脚本 index.php,并以 ?r= 方式传递路由参数,确保请求被 Yii 2 内核接管:
立即学习“PHP免费学习笔记(深入)”;
<form action="syllabus/lms/index.php" method="post">
<!-- 注意:此处 action 是相对路径,等价于 /syllabus/lms/index.php -->
Author: <input type="text" name="author" placeholder="Author's Name" />
<br><br>
Number of published Article: <input type="number" name="num_article" placeholder="Published Article" />
<br><br>
<input type="submit" name="submit" value="Submit">
</form>⚠️ 关键注意事项:
- action 中的 syllabus/lms/index.php 必须是相对于当前页面 URL 的有效路径(例如当前页为 http://localhost/syllabus/lms/form.html,则该路径可访问);
- 若部署在子目录(如 /myapp/),请确保 index.php 路径准确,推荐使用绝对路径:/myapp/web/index.php?r=syllabus%2Flms%2Findex;
- 更健壮的方式是通过 Yii 提供的 URL 工具生成(即使在纯 PHP 模板中也可调用):
<?php use yii\helpers\Url; $actionUrl = Url::to(['syllabus/lms/index']); // 返回 /syllabus/lms/index.php?r=syllabus%2Flms%2Findex(启用 Pretty URL 时) ?> <form action="<?= htmlspecialchars($actionUrl) ?>" method="post">
(前提是该模板在 Yii 应用上下文中执行,如视图文件 .php)
最后,在后端接收时,仍可使用原生 PHP 方式处理(无需依赖 Yii 的 Model 或 Request 组件):
<?php
if (isset($_POST['submit'])) {
$author = $_POST['author'] ?? '';
$numArticle = (int)($_POST['num_article'] ?? 0);
echo "<p>Received: Author = {$author}, Articles = {$numArticle}</p>";
// ✅ 此时已确保请求由 Yii 处理,$_POST 数据安全可用
}
?>总结:在 Yii 2 中混合使用原生表单完全可行,核心原则是——所有请求必须经由 index.php 入口。放弃 Pretty URL 的 action 写法,改用显式 index.php + ?r= 路由,即可兼顾框架能力与原生灵活性。



















