zoukankan      html  css  js  c++  java
  • YII中的URL Management j神

    Web应用程序完整的URL管理包括两个方面。首先, 当用户请求约定的URL,应用程序需要解析它变成可以理解的参数。第二,应用程序需求提供一种创造URL的方法,以便创建的URL应用程序可以理解的。对于Yii应用程序,这些通过CUrlManager辅助完成。

    Creating URLs(创建网址)

    虽然URL可被硬编码在控制器的视图(view)文件,但往往可以很灵活地动态创建它们:

    $url=$this->createUrl($route,$params);

    $this指的是控制器实例;$route指定请求的route 的要求;$params列出了附加在网址中的GET参数。

    默认情况下,URL以get格式使用createUrl 创建。例如,提供$route='post/read'$params=array('id'=>100),我们将获得以下网址:

    /index.php?r=post/read&id=100

    参数以一系列Name=Value通过符号串联起来出现在请求字符串,r参数指的是请求的route 。这种URL格式用户友好性不是很好,因为它需要一些非字字符。

    我们可以使上述网址看起来更简洁,更不言自明,通过采用所谓的'path格式,省去查询字符串和把GET参数加到路径信息,作为网址的一部分:

    /index.php/post/read/id/100

    要更改URL格式,我们应该配置urlManager应用元件,以便createUrl可以自动切换到新格式和应用程序可以正确理解新的网址:

    array(
        ......
        'components'=>array(
            ......
            'urlManager'=>array(
                'urlFormat'=>'path',
            ),
        ),
    );

    请注意,我们不需要指定的urlManager元件的类,因为它在CWebApplication预声明为CUrlManager。

    createurl方法所产生的是一个相对地址。为了得到一个绝对的url ,我们可以用前缀yii">

    提示:此网址通过createurl方法所产生的是一个相对地址。为了得到一个绝对的url ,我们可以用前缀yii:,或调用createAbsoluteUrl 。:app()->hostInfo

    User-friendly URLs(用户友好的URL)

    当用path格式URL,我们可以指定某些URL规则使我们的网址更用户友好性。例如,我们可以产生一个短短的URL/post/100,而不是冗长/index.php/post/read/id/100。网址创建和解析都是通过CUrlManager指定网址规则。

    要指定的URL规则,我们必须设定urlManager 应用元件的属性rules:

    array(
        ......
        'components'=>array(
            ......
            'urlManager'=>array(
                'urlFormat'=>'path',
                'rules'=>array(
                    'pattern1'=>'route1',
                    'pattern2'=>'route2',
                    'pattern3'=>'route3',
                ),
            ),
        ),
    );

    这些规则以一系列的路线格式对数组指定,每对对应于一个单一的规则。路线(route)的格式必须是有效的正则表达式,没有分隔符和修饰语。它是用于匹配网址的路径信息部分。还有route应指向一个有效的路线控制器。

    规则可以绑定少量的GET参数。这些出现在规则格式的GET参数,以一种特殊令牌格式表现如下:

    <ParamName:ParamPattern>

    ParamName表示GET参数名字,可选项ParamPattern表示将用于匹配GET参数值的正则表达式。当生成一个网址(URL)时,这些参数令牌将被相应的参数值替换;当解析一个网址时,相应的GET参数将通过解析结果来生成。

    我们使用一些例子来解释网址工作规则。我们假设我们的规则包括如下三个:

    array(
        'posts'=>'post/list',
        'post/<id:\d+>'=>'post/read',
        'post/<year:\d{4}>/<title>'=>'post/read',
    )
    • 调用$this->createUrl('post/list')生成/index.php/posts。第一个规则适用。

    • 调用$this->createUrl('post/read',array('id'=>100))生成/index.php/post/100。第二个规则适用。

    • 调用$this->createUrl('post/read',array('year'=>2008,'title'=>'a sample post'))生成/index.php/post/2008/a%20sample%20post。第三个规则适用。

    • 调用$this->createUrl('post/read')产生/index.php/post/read。请注意,没有规则适用。

    总之,当使用createUrl生成网址,路线和传递给该方法的GET参数被用来决定哪些网址规则适用。如果关联规则中的每个参数可以在GET参数找到的,将被传递给createUrl ,如果路线的规则也匹配路线参数,规则将用来生成网址。

    如果GET参数传递到createUrl是以上所要求的一项规则,其他参数将出现在查询字符串。例如,如果我们调用$this->createUrl('post/read',array('id'=>100,'year'=>2008)),我们将获得/index.php/post/100?year=2008。为了使这些额外参数出现在路径信息的一部分,我们应该给规则附加/*。 因此,该规则post/<id:\d+>/*,我们可以获取网址/index.php/post/100/year/2008

    正如我们提到的,URL规则的其他用途是解析请求网址。当然,这是URL生成的一个逆过程。例如, 当用户请求/index.php/post/100,上面例子的第二个规则将适用来解析路线post/read和GET参数array('id'=>100)(可通过$_GET获得) 。

    createurl方法所产生的是一个相对地址。为了得到一个绝对的url ,我们可以用前缀yii">

    注:使用的URL规则将降低应用的性能。这是因为当解析请求的URL , CUrlManager 尝试使用每个规则来匹配它,直到某个规则可以适用。因此,高流量网站应用应尽量减少其使用的URL规则。

    隐藏index.php

    还有一点,我们可以做进一步清理我们的网址,即在URL中藏匿index.php入口脚本。这就要求我们配置Web服务器,以及urlManager应用程序元件。

    我们首先需要配置Web服务器,这样一个URL没有入口脚本仍然可以处理入口脚本。如果是Apache HTTP server ,可以通过打开网址重写引擎和指定一些重写规则。这两个操作可以在包含入口脚本的目录下的.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

    然后,我们设定urlManager元件的showScriptName属性为false

    现在,如果我们调用$this->createUrl('post/read',array('id'=>100)),我们将获取网址/post/100。更重要的是,这个URL可以被我们的Web应用程序正确解析。

    Faking URL Suffix(伪造URL后缀)

    我们还可以添加一些网址的后缀。例如,我们可以用/post/100.html来替代/post/100。这使得它看起来更像一个静态网页URL。为了做到这一点,只需配置urlManager元件的urlSuffix属性为你所喜欢的后缀。

  • 相关阅读:
    前端-CSS-更改标签样式-长宽字体-背景-边框-显示方式-定位-透明度-扩展点-02
    前端-CSS-初探-注释-语法结构-引入方式-选择器-选择器优先级-01(待完善)
    前端-HTML-web服务本质-HTTP协议-请求-标签-01(待完善)
    python-优酷系统管理员视图粗糙版(无详细注释)
    粗糙版ORM(附详细注释)
    python-面向对象速查表-内置方法-内置函数-内置属性(只整理了部分内容)
    MySQL-存储引擎-创建表-字段数据类型-严格模式-字段约束-键-02
    作业九——DFA最小化
    作业八——非确定的自动机NFA确定化为DFA
    作业七——正规式到正规文法与自动机
  • 原文地址:https://www.cnblogs.com/jshen/p/2844534.html
Copyright © 2011-2022 走看看