Yii 高级 url 重写

2024-01-24

注意 ANYTHING_ELSE 因此,我有我的控制器和操作,我希望它们能够正常运行,以响应如下示例:

// for UserContoller with actionList and actionEdit
user/list
user/edit/25

但对于不属于特定控制器和操作的所有内容,我希望它们属于一个默认控制器和操作,例如:BlogController 和 actionView。这就是 ANYTHING_ELSE 出现的地方。

// ANYTHING_ELSE can be:
this-is-a-test-page
this/is/another/page/with/lots/of/slashes
this-has-extension.html


'urlManager' => array(
  'urlFormat' => 'path',
  'showScriptName' => false,
  'rules' => array(
    '<controller:\w+>/<id:\d+>' => '<controller>/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
    '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
    'ANYTHING_ELSE' => 'blog/view',
   ),
),

我将逐步解释如何使其发挥作用。

第 1 步 - 创建一个 Yii Web 应用程序

在控制台中导航到 Yii 框架路径并创建一个新的 Web 应用程序。就我而言,我在控制台中使用了这个:

cd c:\zeus\yii-1.1.10.r3566\framework
yiic webapp c:\zeus\www\yiiblog

其中 c:\zeus\yii-1.1.10.r3566\framework 是我的 Yii php 框架路径,c:\zeus\www\yiiblog 是我的 Yii webapp 测试文件夹的路径

第 2 步 - 将我的域名伪造为 dev.yiiblog.com

转到 C:\Windows\System32\drivers\etc 并通过添加以下行来编辑主机文件:

127.0.0.1 dev.yiiblog.com

步骤 3 - 更改 apache httpd.conf 文件

<VirtualHost *:80>
    DocumentRoot "c:/zeus/www/yiiblog"
    ServerName dev.yiiblog.com
    ErrorLog "logs/dev.yiiblog.com-error.log"
    CustomLog "logs/dev.yiiblog.com-access.log" common
</VirtualHost>

并重新启动apache服务。我在 Windows 控制台中使用:

net stop apache
net start apache

其中我的 Apache 2 服务名为“apache”,而不是默认的“apache2.2”。

第 4 步 - 创建数据库并配置到 Yii 的数据库连接

我创建了一个数据库 yiitest 和一个用户 yiitest。然后我打开位于 ad /protected/config/main.php 的 Yii 配置文件并编辑与 MySQL 的连接:

'db'=>array(
  'connectionString' => 'mysql:host=localhost;dbname=yiitest',
  'emulatePrepare' => true,
  'username' => 'yiitest',
  'password' => 'password',
  'charset' => 'utf8',
),

第 5 步 - 下载 dburlmanager Yii 扩展

前往 Yii dburlmanager,下载 Yii dburlmanager 扩展http://www.yiiframework.com/extension/dburlmanager/ http://www.yiiframework.com/extension/dburlmanager/并将其解压到您的 /protected/extensions 文件夹

第 6 步 - 创建 MySQL 数据库表并添加虚拟数据

CREATE TABLE IF NOT EXISTS `articles` (
  `seoURL` varchar(100) NOT NULL
) ENGINE=InnoDB;

INSERT INTO `articles` (`seoURL`) VALUES
('first-post'),
('another-post'),
('post/value'),
('website/page1');

CREATE TABLE IF NOT EXISTS `pages` (
  `seoURL` varchar(100) NOT NULL
) ENGINE=InnoDB;

INSERT INTO `pages` (`seoURL`) VALUES
('page-first-post'),
('page-another-post'),
('page/post/value.html'),
('page-website/page1');

第 7 步 - 创建您的 Yii 自定义控制器

在 /protected/controllers 文件夹下创建两个名为 ArticleController.php 和 PageController.php 的 php 文件:

ArticleController.php 内容:

<?php
/**
 * @filename ArticleController.php
 */

class ArticleController extends CController {
  public function actionView() {
    $this->render('view', array(
      'article' => isset($_GET['article'])?$_GET['article']:'',
    ));
  }
}

PageController.php内容:

<?php
/**
 * @filename PageController.php
 */
class PageController extends CController {
  public function actionView() {
    $this->render('view', array(
      'page' => isset($_GET['page'])?$_GET['page']:'',
    ));
  }
}

第 8 步 - 创建您的自定义 Yii 视图

使用路径 /protected/views/article/view.php 和 /protected/views/page/view.php 创建与上述控制器相对应的视图文件:

文章查看内容:

<h1>Article View Test</h1>
<br />
<?php
    if (isset ($article)) echo "article: $article";
?>

页面查看内容:

<h1>Page View Test</h1>
<br />
<?php
    if (isset ($page)) echo "page: $page";
?>

第 9 步 - 添加自定义 Yii url 规则

再次打开 main.php Yii 配置文件并将 urlManager 设置为类似以下内容:

'urlManager'=>array(
  'urlFormat'=>'path',
  'class'=>'ext.DbUrlManager.EDbUrlManager',
  'connectionID'=>'db',
  'rules'=>array(
    '<article:[\w\/.-]+>'=>array(
      'article/view',
      'type'=>'db',
      'fields'=>array(
        'article'=>array(
          'table'=>'articles',
          'field'=>'seoURL'
        ),
      ),
    ),

    '<page:[\w\/.-]+>'=>array(
      'page/view',
      'type'=>'db',
      'fields'=>array(
        'page'=>array(
          'table'=>'pages',
          'field'=>'seoURL'
        ),
      ),
    ),

    '<controller:\w+>/<id:\d+>' => '<controller>/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
    '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
  ),
  'showScriptName'=>false,
),

步骤 10 - 创建 .htaccess 文件

在您的 Web 应用程序根目录下创建一个 .htaccess 文件,并将其内容删除为:

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php

第 11 步 - 测试您的 SEO 友好 URL

dev.yiiblog.com/first-post
dev.yiiblog.com/page-first-post

etc

享受创建精彩博客或其他具有完整 URL 管理功能的 Web 应用程序的乐趣。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yii 高级 url 重写 的相关文章

随机推荐

  • Grails 打包和命名约定

    包装控制器 服务等IE com company controllers com company services 这是一个好的做法还是应该避免 我遇到的另一个值得一提的问题是命名服务示例 SomthingGatewayService gro
  • 在 Android ContentProvider 中连接表和通知 ContentObservers 的最佳实践

    我有一个 ContentProvider 来处理与我的应用程序相关的所有数据插入和检索 我遵循 Virgil Doobjanschi 在 Google I O 上建议的模式 我正在使用第一种模式 我的问题是我有一个由数据库中的多个表表示的逻
  • 动画结束后的 CSS 过渡

    我有一个 css 过渡 可以在悬停时移动元素 还有一个动画 可以在悬停时旋转元素 动画上有一个等于过渡持续时间的延迟 因此在过渡到正确位置后 动画就会开始 它工作得很好 但是 当我们将鼠标移开时 动画会停止 但不会向下过渡 是否可以在鼠标移
  • 从 TypeScript->CommonJS 模块导出带有字体资源的全局样式

    我有一个 TypeScript React 项目 组织如下 tsconfig json package json yarn lock lerna json node modules packages ui library package j
  • 从 rfft2 数组创建 fft2 结果

    我试图通过操作 rfft2 的结果来重新创建完整 fft2 的结果 该文档指出 rfft2 仅计算正系数 因为当输入为实数时 负系数与正系数具有对称性 这对于大型数组非常有用 因为计算 rfft2 比完整的 fft2 快得多 所以下面的代码
  • 如何处理 MySQL 多边形重叠查询?

    例如 我有一个用户表 每个用户都是地图上的一个 正方形 或圆圈 我想找到这样的用户overlap地图上的另一个广场 MySQL 5 6 目前支持此功能吗 MySQL 的开发版本怎么样 请注意 我不是在寻找 查找在该正方形内有一个点的用户 我
  • 小负数四舍五入后保持符号

    即使舍入结果为零 MATLAB 似乎也会记住原始符号 由于小负值已四舍五入为零 因此该信号不再有意义 代码示例 a 0 001 ar round a 2 fprintf a 2f a rounded 2f Zero 2f n a ar 0
  • 将 MILOC 与 Fortran 结合使用:赋值中的等级 0 和 1 不兼容

    给出错误消息的版本 program hello integer a 9 integer index note no dimension here a 1 3 4 5 6 7 8 9 10 index MINLOC a MASK a gt 5
  • 如何知道动画为什么会卡顿?

    我有一些相当简单的动画 移动文本 移动椭圆等 并在全屏 1920x1080 减去任务栏 下运行 WPF Performance Suite 报告整个动画的帧速率约为 50 FPS 脏矩形加法约为 300 矩形 秒 SW 帧在 0 到 4 之
  • 神经网络:连续输出变量的 Sigmoid 激活函数

    好吧 所以我正处于中间Andrew Ng 在 coursera 上的机器学习课程 https www coursera org course ml并希望调整作为作业 4 的一部分完成的神经网络 特别是 我在作业中正确完成的神经网络如下 S
  • 谷歌地图根据窗口调整大小设置不同的缩放

    继我之前的问题之后谷歌地图响应式调整大小 https stackoverflow com questions 18444161 google maps responsive resize我想根据窗口调整大小实现不同的缩放级别 调整大小时 因
  • 在 perl 或 awk 中将每 4 列打印到一行

    您能帮助我如何将每 4 个连续行转换为一个制表符分隔的列吗 convert A 1 2 3 3 3 4 1 to A 1 2 3 3 3 4 1 执行此操作的一个简单方法是使用xargs xargs n4 lt file A 1 2 3 3
  • 使用 dplyr 包中的 group_by 和 mutate 通过 id 变量创建新的因子变量

    我有一个长格式的分层数据框 其中每一行代表关系 其中许多关系可以属于一个人 以下是一个小型示例数据集的代码 df lt data frame id as factor c 1 1 1 2 2 3 4 4 partner c 1 2 3 1
  • 如何获取android.Manifest.permission.MEDIA_CONTENT_CONTROL的android权限

    我正在尝试使用 API21 中的 MediaSessionManager 来控制设备上的音乐播放 对于使用 它说需要持有 android Manifest permission MEDIA CONTENT CONTROL public vo
  • 为什么要为多个平台编译 .NET 代码

    当 e G 创建 Windows Phone 应用程序时 我必须选择 x86 在模拟器中进行调试 并选择 ARM 在手机上进行调试 那当然是因为我的电脑运行的是 x86 具体来说是 x64 但 x64 处理器仅在寄存器长度上有所不同 如果我
  • 如何使用 T-SQL 将两个整数相除得到浮点结果?

    使用 T SQL 和 Microsoft SQL Server 当我在 2 个整数之间进行除法时 我想指定小数位数 例如 select 1 3 目前返回0 我希望它能回来0 33 就像是 select round 1 3 2 但这是行不通的
  • 寻找一种具有尽可能少的比较操作的排序算法

    我想对由人类执行比较的项目进行排序 Pictures 工作项目的优先级 对于这些任务 比较次数是性能的限制因素 需要的最少比较次数是多少 我假设 gt N for N items 哪种算法可以保证这个最小数量 为了回答这个问题 我们需要做出
  • w8 默认平板电脑设置与 WPF 布局冲突

    我有一个 WPF 桌面应用程序 我收到 W8 用户的报告 称我们应用程序中的代码完成窗口未正确对齐 我调查发现它是W8平板电脑设置中的一个设置与wpf中弹出窗口的位置冲突 Default is right handed and then t
  • 一个表可以有两个外键吗?

    我有下表 主键bold 外键输入Italic 顾客表 ID 姓名 平衡 帐户名称 帐户类型 账户类别表 帐户类型 平衡 客户明细表 帐户名称 名字 姓氏 地址 我可以在 Customer 表中有两个外键吗 如何在 MySQL 中实现这一点
  • Yii 高级 url 重写

    注意 ANYTHING ELSE 因此 我有我的控制器和操作 我希望它们能够正常运行 以响应如下示例 for UserContoller with actionList and actionEdit user list user edit