YII2美化商品URL遇404问题:如何实现domain.com/adv/14792格式
解决Yii2 URL美化后无效果或404的问题
问题根源分析
你要把domain.com/adv?id=14792优化为domain.com/adv/14792,两次配置出现的问题分别对应不同原因:
- 第一次规则无效果:规则映射的是
site/adv,但如果URL是硬编码生成而非用Yii的URL助手,规则不会自动触发;加上enableStrictParsing=true的限制,若原有路由未被正确覆盖,也会导致规则不生效。 - 第二次规则出现404:规则映射到
adv(即AdvController的默认方法),如果项目中不存在AdvController,或者该控制器没有接收$id参数的actionIndex方法,就会返回404;另外Web服务器未配置重写规则,请求无法被Yii框架处理也会引发404。
具体解决方案
1. 匹配控制器与方法
如果商品页逻辑在SiteController的actionAdv中,保留第一条规则,但必须用Yii的URL助手生成链接:
// 生成美化后的URL echo Url::to(['site/adv', 'id' => 14792]);
如果想直接映射到AdvController,先确保项目中存在该控制器,且方法接收$id参数:
// AdvController.php class AdvController extends Controller { public function actionIndex($id) { // 商品逻辑处理代码 } }
2. 配置Web服务器重写规则
- Apache:在web目录下创建
.htaccess文件,写入:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php
- Nginx:在server配置块中添加:
location / { try_files $uri $uri/ /index.php?$args; }
3. 调整urlManager配置
建议关闭严格解析(除非你强制所有请求必须匹配规则),并保证规则顺序正确(具体规则放前面):
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'enableStrictParsing' => false, 'rules' => [ 'adv/<id:\d+>' => 'site/adv', // 或改为'adv',根据你的控制器调整 '<alias:[\w-]+>' => 'site/<alias>', ], ],
4. 验证与排查
修改配置后清除Yii缓存(若开启缓存),访问domain.com/adv/14792测试。如果仍有问题,查看runtime/logs目录下的框架日志,根据错误信息定位具体问题。
内容的提问来源于stack exchange,提问作者user3774771
相关产品推荐
相关产品推荐

