精华内容
下载资源
问答
  • URL地址重写

    千次阅读 2014-09-22 16:39:16
    URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程。举个例子来说,如果通过浏览器进来的URL是“UserProfile.aspx?ID=1”那么它可以被重写成 “UserProfile/1.aspx”,这样的...
    URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程。举个例子来说,如果通过 浏览器进来的URL是“UserProfile.aspx?ID=1”那么它可以被重写成 “UserProfile/1.aspx”,这样的URL,这样的网址可以更好的被网站所阅读。
    如果浏览器不支持Cookie或用户阻止了所有Cookie,可以把会话ID附加在HTML页面中所有的URL上,这些页面作为响应发送给客户。这样,当用户单击URL时,会话ID被自动作为请求行的一部分而不是作为头行发送回服务器。这种方法称为URL重写(URL rewriting)。
    一般来说,URL重写是支持会话的非常健壮的方法。在不能确定浏览器是否支持Cookie的情况下应该使用这种方法。然而,使用URL重写应该注意下面几点:
    1.如果使用URL重写,应该在应用程序的所有页面中,对所有的URL编码,包括所有的超链接和表单的action属性值。
    2.应用程序的所有的页面都应该是动态的。因为不同的用户具有不同的会话ID,因此在静态HTML页面中无法在URL上附加会话ID。
    3.所有静态的HTML页面必须通过Servlet运行,在它将页面发送给客户时会重写URL。 [1]  

    2标准化编辑

    概述

    URL标准化,英文: urlcanonicalization来自matt cutts的博客文章:SEO advice: url canonicalization 中文翻译: SEO的建议:URL标准化 “URL标准化”是一个动名词,不好直接解释,我把它反过来一下:

    标准化URL

    很多情况下,我们认为以下这几个链接都指向同一个页面(首页):
    但是从URL发送请求并返回网页内容的过程来看,这些URL都是互不相同的。对于上述URLs,Web服务器完全可以返回完全不同的内容。当这些URL所对应的内容都一样时(一般情况下都一样的),谷歌需要从上述URLs中选一个具有代表性的,而忽略其余的。那么这个被谷歌选择了的URL,就是一个标准化的URL。谷歌选择的这个过程称为“标准化”。

    3特别注意编辑

    根据不同的服务器就会有不同的URL重写规则,比如 iis apache nginx 这三种重写方式都是不同的,并非完全一样的。

    4静态化编辑

    概述

    这是SEO过程中经常碰到的问题,也是必须解决的问题。因为搜索引擎喜欢 静态页面。从Web服务器的角度,这个问题转变为:如何将静态化的文件名称转化成参数。

    需要两步来处理

    ⒈把网页上带链接的地方,都换上新的静态化链接。搜索引擎和 浏览器将通过该链接来发生请求。(有些人做修改不是在网页上,而是进行 动态链接静态链接的转向,这是严重错误的)
    ⒉在httpd.conf或.htaccess中使用RewriteRule:
    RewriteRule "^/dir/ ([^./]*) \.html" "/dir/script.cgi?doc=$1" [PT]
    [PT]标记告诉Apache执行后续的所有操作。
    通过这个功能,使 动态页面静态链接的形式展示给搜索引擎,从而达到URL优化的目的。

    5好处编辑

    功能好处

    重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读和索引你的网站的能力;而且在你改变了自己的网站结构后,无需要求用户修改他们的书签,无需其他网站修改它们的友情链接;它还可以提高你的网站的安全性;而且通常会让你的网站更加便于使用和更专业。

    重写式跟踪

    当客户机不接受cookie时,server就使用URL重写作为会话跟踪的基本方式.URL重写,添加了附加数据(会话ID)到请求的URL路径上.
    会话ID必须被编码作为该URL字符串中的路径参数。该参数的名称为jsessionid,
    例如:
    index.html;jsessionid=1234

    6优点编辑

    ⒈缩短 url,隐藏实际路径提高安全性。
    ⒉易于用户记忆和键入。
    ⒊易于被搜索引擎收录。

    7重定向编辑

    制作404页面

    很多时候,我们考虑把无效的URL比如:用户拼错的URL、不存在的URL重定向到别的网页,例如网站的首页、 404页面等。
    在httpd.conf或.htaccess文件中使用ErrorDocument来捕获404 (找不到文件)错误:
    ErrorDocument 404 /index.html
    DirectoryIndex index.html /path/to/notfound.html
    本功能会让所有的404错误——每次当某人请求无效的URL 时,都返回URL / index.html 提供的 网站首页

    注意事项

    ⒈直接指向首页是否是合适的?或者让它指向到一个 404页面会更好些?如果在404页面用javascript做一个跳转到首页,也是SEO允许的做法。
    ⒉即使返回有效的文件,仍然会将404 状态码返回给 客户端和搜索引擎。这表示 搜索引擎机器人来确认网站上的链接时,仍然会得到正确的结果(404状态码)。

    为什么使用URL地址重写? 
         因为有些浏览器的安全设置,禁用了session.而session的原理则是把session的ID保存在客户端的cookie中。所以这个时候如果cookie功能被禁用的话,所有使用session的功能将失效.如果采用url地址重写技术,则server会把session经过编码以后,写到url地址后面当做参数来传递.这样既提高了客户端的安全性,同时也避免了功能被屏蔽的风险.下面是一个使用url地址重写的servlet例子.其中核心代码为 
    resp.encodeURL(req.getRequestURL().toString()); 


    Java代码   收藏代码
    1. public class SessionTest extends HttpServlet {  
    2.   
    3.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
    4.             throws ServletException, IOException {  
    5.         PrintWriter out = resp.getWriter();  
    6.         HttpSession session =req.getSession(true);// true代表先从客户端获取cookie  
    7.           
    8.         out.flush();  
    9.         out.close();  
    10.           
    11.         /* 
    12.          * session默认,也是要把sessionID写到客户端的内存当中(内存cookie) 
    13.          * 重写地址,防止禁用cookie的时候,仍然可以使用session 
    14.          */  
    15.         resp.encodeURL(req.getRequestURL().toString());  
    16.   
    17.         //地址编码,在url中,传递中文  
    18.         org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode(String s ,request.getCharacterEncoding());  
    19.     }  
    20.   
    21.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
    22.             throws ServletException, IOException {  
    23.         doGet(req, resp);  
    24.     }  
    25.   
    26. }  

    处理引擎编辑

    Apache

    • mod_rewrite,Apache 官方的 URL Rewriting 模块
    • mod_alias,Apache 1.3 的 URL 别名模块
    Microsoft Internet Information Server(IIS)
    • URL Rewrite Module for IIS 7.0,由微软官方发展
    • IIS Mod-Rewrite。
    • IISRewrite。
    • URL Replacer。
    • Ionic's ISAPI Rewrite Filter (IIRF),无须 .NET,免费的开放源代码组件。
    • .NET URL Rewriter and Reverse Proxy,免费的 URL Rewriting 与反向代理组件,支持 .NET 2.0/3.5,IIS 6.0/7.0。
    • [1]  
    展开全文
  • 1. 去掉地址中的/api部分 location /api/ws{ rewrite "^/api(.*)$" $1; } 2. /ws地址将转发http://47.119.131.185 location /ws { proxy_pass http://47.119.131.185; } 3. 转换/api/interface为/interface...

    1.  去掉地址中的/api部分

    location /api/ws{
            rewrite "^/api(.*)$" $1;
        }

    2.  /ws地址将转发http://47.119.131.185

    location /ws {
            proxy_pass http://47.119.131.185;  
        } 

    3.  转换/api/interface为/interface并转发到https://siwei.me

    location /api/interface{
            rewrite "^/api(.*)$" $1;
        }
        location /interface{
                proxy_pass http://siwei.me;
        }

    要测试上面的修改  nginx -t

    要使用上面的修改生效  nginx -s reload

     

    展开全文
  • 第一种方法:Apache环境中如果要将URL地址重写,正则表达式是最基本的要求,但对于一般的URL地址来说,基本的匹配就能实现我们大部分要求,因此除非 是非常特殊的URL地址,但这不是我要讨论的范围,简单几招学会...
    Apache的URL地址重写
    
    http://hi.baidu.com/sonan/blog/item/c408963d89468208bba16716.html
    第一种方法:Apache环境中如果要将URL地址重写,正则表达式是最基本的要求,但对于一般的URL地址来说,基本的匹配就能实现我们大部分要求,因此除非 是非常特殊的URL地址,但这不是我要讨论的范围,简单几招学会Apache中URL地址重写,通过实例展示,轻松学会URL地址重写:
    URL实例
    重写URL:http://www.baidu.com/?p=152
    原始URL:http://www.baidu.com/p152.html
    重写规则:
    ^p([0-9]+)\.html      /?p=$1     [L]
    正则基础知识:
    ^ 匹配行的开始,匹配URL地址的开头部分,对于RewriteRule而言,域名(http://www.biuuu.com)不是URL地址的一部分,如上:?p=152
    () 分隔一个被捕获的表达式,如上:([0-9]+)
    [] 定义字符类,如上:[0-9] 表示从0-9的数字
    + 说明前面的字符可以被重复匹配1次或数次,如上:[0-9]+,表示任何数字组合
    \ 字符转义,如上:转义.
    其它:
    [L] 表示last,停止匹配其它
    方法如下:
    1,打开httpd.conf文件,找到
    #LoadModule rewrite_module modules/mod_rewrite.so 注释前面#
    2,打开httpd-vhosts.conf文件,在VirtualHost添加重写规则,
    RewriteEngine On
    RewriteRule ^p([0-9]+)\.html      /?p=$1     [L]
    基本上就上面这两个步骤,其实总的来说,Apache中URL地址重写还是比较简单的,比看文档学习要快的多,不过要想深入了解还是有必要看看相关文档的,其它规则可以自定义。记住一点:任何匹配其实就是一个正则表达式的替换过程。
    创建友好的搜索引擎URL地址对于PHP程序员来说非常重要,因此简单学会Apache中URL地址重写将是一项最基本的要求。
    第二种方法:
    1,首先检查是否已安装rewrite模块:
    cat httpd.conf | grep rewrite
    LoadModule rewrite_module modules/mod_rewrite.so
    2,生成伪静态html连接:
    (1)生成伪静态html
    在<VirtualHost>段最后加入
    RewriteEngine on
    RewriteRule /goods([0-9]+).html /goods.php?id=$1 [PT] 
    更标准的写法为:
    RewriteRule ^(.*)/goods([0-9]+).html$ $1/goods.php?id=$2 [PT]
    更简洁的写法:
    /goods(\d+)\.html /goods\.php\?id=$1
    第一个(0-9]+)对应参数$1,以此类推第二个对应$2
    举例:
    RewriteRule /forum-([0-9]+)-([0-9]+)\.html /forumdisplay.php?fid=$1&page=$2 [PT]
    测试http://www.xxx.com/goods1.html 是否与/goods.php?id=1的内容相同
    最后将所有链接换成设置后的伪静态html地址方式
    [PT]:url全局转换,即转换过的goods31.html对应goods.php?id=31 (默认就是这个不加参数)
    [R]:    url重定向  即使用goods31.html访问时跳转到goods.php?id=31
    3,防盗链:
    RewriteCrond %{HTTP_HOST} !upkiller.com [R=301,L]
    RewriteRule ^(.*)$ http://www.upkiller.com/warning.html [R=301,L]
    把不是来自upkiller.com的请求重定向到http://www.upkiller.com
    更好的做法:
    RewriteCond %{HTTP_REFERER} !^http://(www\.)?upkiller\.com/.*$ [NC]
    RewriteRule \.(mp3|rar|jpe|gif)$ http://www.upkiller.com/warning.jpg [R=301,L]
    4,防百度爬虫:
    RewriteCond %{HTTP_USER_AGENT} ^Baiduspider [OR]
    RewriteRule ^(.*)$ http://www.google.com [R=301,L]
    把来自百度的爬虫转到goole
    PS:PHP伪静态方式
    方法一: 
    比如这个网页 
    http://www.xxxx.com/soft.php/1,100,8630.html 
    其实处理的脚本是soft.php 参数为1,100,8630 
    相当于soft.php?a=1&b=1=100&c=8630 只不过这样的URL太难记。搜索引擎也不喜欢。 
    真静态只是完全生成了HTML。 
    客户端访问的时候直接输出。不用脚本解释。在流量非常大的时候(比如每天有上百万的访问量的时候)会起到很好的效果。也就是说服务器端实实在在的存在这个HTML页面。 
    当然在你网站的流量没有那么大的时候。URL重写是最好的方法(个人观点,大流量的时候可以考虑负载均衡了。同样没有关系) 
    附URL重写的方法有很多种,APACHE,IISREWRITE。甚至PHP脚本都可以直接处理。比如上例中就是PHP脚本直接处理(该方法好处是大流量的时候直接减轻WEB伺服器的压力。PS:同样也是个人观点: 
    ================================================ 
    下面以程序为例讲一下PHP伪静态的程序实现方法,其实这方法我之前已经有在其它论坛社区发过 
    程序为例: 
    http://www.xxxx.com/soft.php/1,100,8630.html 
    CODE: 
    //利用server变量 取得PATH_INFO信息 该例中为 /1,100,8630.html 也就是执行脚本名后面的部分 
    if(@$path_info =$_SERVER["PATH_INFO"]){ 
    //正则匹配一下参数 
    if(preg_match("/\/(\d+),(\d+),(\d+)\.html/si",$path_info,$arr_path)){ 
    $gid =intval($arr_path[1]); //取得值 1 
    $sid =intval($arr_path[2]); //取得值100 
    $softid =intval($arr_path[3]); //取得值8630 
    }else die("Path:Error!"); 
    //相当于soft.php?gid=1&sid=100&softid=8630 
    //就是这么简单了。~) 
    方法二: 
    一 打开 Apache 的配置文件 httpd.conf 。 
    二 将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉 
    三 在 httpd.conf中添加: 
    <IfModule mod_rewrite.c> 
    RewriteEngine On 
    #RewriteCond %{ENV:SCRIPT_URL} (?:index|dispbbs)[-0-9]+.html 
    RewriteRule ^(.*?(?:index|dispbbs))-([-0-9]+).html 1.php?__is_apache_rewrite=1&__rewrite_arg=2 
    </IfModule> 
    四 要实现asp帖子URL到php帖子的映射,在 第三步的<IfModule mod_rewrite.c>和</IfModule>之间添加: 
    RewriteMap tolowercase int:tolower 
    RewriteCond %{QUERY_STRING} (?:boardid|page|id|replyid|star|skin)=d+ [NC] 
    RewriteRule ^(.*(?:index|dispbbs)).asp 1.php?{tolowercase:%{QUERY_STRING}}&__is_apache_rewrite=1 
    五 保存httpd.conf并重启Apache 
    方法三: 
    <?php 
    /* 
    功能:PHP伪静态化页面的实现 
    具体用法: 
    例如链接为:test.php/year/2006/action/_add.html 
    mod_rewrite(); 
    $yearn=$_GET["year"];//结果为'2006' 
    $action=$_GET["action"];//结果为'_add' 
    */ 
    function mod_rewrite(){ 
    global $_GET; 
    $nav=$_SERVER["REQUEST_URI"]; 
    $script_name=$_SERVER["SCRIPT_NAME"]; 
    $nav=substr(ereg_replace("^$script_name","",urldecode($nav)),1); 
    $nav=preg_replace("/^.ht(m){1}(l){0,1}$/","",$nav);//这句是去掉尾部的.html或.htm 
    $vars = explode("/",$nav); 
    for($i=0;$i<Count($vars);$i+=2){ 
    $_GET["$vars[$i]"]=$vars[$i+1]; 

    return $_GET; 

    mod_rewrite(); 
    $yearn=$_GET["year"];//结果为'2006' 
    $action=$_GET["action"];//结果为'_add' 
    echo $yearn; 
    echo $action; 
    ?> 
    <?php 
    /* 
    功能:PHP伪静态化页面的实现 
    具体用法: 
    例如链接为:test.php/year/2006/action/_add.html 
    mod_rewrite(); 
    $yearn=$_GET["year"];//结果为'2006' 
    $action=$_GET["action"];//结果为'_add' 
    */ 
    function mod_rewrite(){ 
    global $_GET; 
    $nav=$_SERVER["REQUEST_URI"]; 
    $script_name=$_SERVER["SCRIPT_NAME"]; 
    $nav=substr(ereg_replace("^$script_name","",urldecode($nav)),1); 
    $nav=preg_replace("/^.ht(m){1}(l){0,1}$/","",$nav);//这句是去掉尾部的.html或.htm 
    $vars = explode("/",$nav); 
    for($i=0;$i<Count($vars);$i+=2){ 
    $_GET["$vars[$i]"]=$vars[$i+1]; 

    return $_GET; 

    mod_rewrite(); 
    $yearn=$_GET["year"];//结果为'2006' 
    $action=$_GET["action"];//结果为'_add' 
    echo $yearn; 

    echo $action;

    =====================================================================================================================

    Apache的Mod_rewrite学习 (RewriteCond重写规则的条件)
    RewriteCond Syntax: RewriteCond TestString CondPattern [flags]   RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当自身的模 板(pattern)匹配成功且这些条件也满足时规则才被应用于当前URL处理。   TestString是一个字符串,除了包含普通的字符外,还可以包括下列的可扩展结构:
    1.       $N,RewriteRule后向引用,其中(0 <= N <= 9)   $N引用紧跟在RewriteCond后面的RewriteRule中模板中的括号中的模板在当前URL中匹配的数据。
    2.       %N,RewriteCond后向引用,其中(0 <= N <= 9)   %N引用最后一个RewriteCond的模板中的括号中的模板在当前URL中匹配的数据。
    3.       ${mapname:key|default},RewriteMap扩展. 具体参见RewriteMap 
    4.       %{ NAME_OF_VARIABLE } ,服务器变量。 变量的名字如下表(分类显示)
     
       

    5.       


    6.       特别说明:
    o        SCRIPT_FILENAME和REQUEST_FILENAME变量含有相同的值,也就是Apache服务器内部数据结构request_rec的 filename字段的值。第一个变量是一个CGI变量,而第二个则与REQUEST_URI(含有request_rec数据结构中uri字段的值)保 持一致。
    o        %{ENV:variable}中的variable可以是任何环境变量的名字。对其值的查找,先通过Apache内部的数据结构,(如找不到)再在Apache服务器进程中通过getenv()查找。
    o        %{HTTP:header}中的header可以是任何HTTP MIME-header的名字,其值通过查找HTTP请求信息而得。
    o        %{LA-U:variable} 用来引用后续API阶段中定义的、当前还不知道的值,具体实现是通过执行一个基于URL的内部的sub-request来决定的variable的最终的 值。例如,假如你想在服务器范围内利用REMOTE_USER的值来完成重写,但这个值是在验证阶段设置的,而验证阶段是在URL转换阶段的后面。从另一 方面讲,由于mod_rewrite在修补(fixup)API阶段进行目录范围的重写,而修补阶段在验证阶段的后面,所以此时只要用% {REMOTE_USER}就可以取得该值了。
    o        %{LA-F:variable},执行一个基于文件名字(filename)的内部sub-request来决定variable的最终的值。大多数时间内,这和LA-U相同。
      CondPattern是一个条件模板,也就是说,是一个扩展正则式(extended regular expression),用与跟TestString进行匹配。作为一个标准的扩展正则式,CondPattern有以下补充:
    1.       可以在模板串前增加一个!前缀,以用表示不匹配模板。但并不是所有的test都可以加!前缀。
    2.       CondPattern中可以使用以下特殊变量:
    o        '<CONDPATTERN' (小于,基于字母顺序) 将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 的字符小于CondPattern为真. 
    o        '>CondPattern' (大于) 将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 的字符大于CondPattern为真. 
    o        '=CondPattern' (等于) 将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 与CondPattern完全相同时为真.如果CondPattern只是 "" (两个引号紧挨在一起) 此时需TestString 为空字符串方为真. 
    o        '-d' (是否为目录) 将testString当作一个目录名,检查它是否存在以及是否是一个目录. 
    o        '-f' (是否是regular file) 将testString当作一个文件名,检查它是否存在以及是否是一个regular文件. 
    o        '-s' (是否为长度不为0的regular文件) 将testString当作一个文件名,检查它是否存在以及是否是一个长度大于0的regular文件
    o        '-l' (是否为symbolic link) 将testString当作一个文件名,检查它是否存在以及是否是一个 symbolic link. 
    o        '-F' (通过subrequest来检查某文件是否可访问) 检查TestString是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成 的, 因此需要小心使用这个功能以降低服务器的性能。
    o        '-U' (通过subrequest来检查某个URL是否存在) 检查TestString是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成 的, 因此需要小心使用这个功能以降低服务器的性能。
      [flags]是第三个参数,多个标志之间用逗号分隔。
    1.       'nocase|NC' (不区分大小写)   在扩展后的TestString和CondPattern中,比较时不区分文本的大小写。注意,这个标志对文件系统和subrequest检查没有影响. 
    2.       'ornext|OR' (建立与下一个条件的或的关系)   默认的情况下,二个条件之间是AND的关系,用这个标志将关系改为OR。例如: RewriteCond %{REMOTE_HOST} ^host1.* [OR] RewriteCond %{REMOTE_HOST} ^host2.* [OR] RewriteCond %{REMOTE_HOST} ^host3.* RewriteRule ... 如果没有[OR]标志,需要写三个条件/规则.
    例子:根据客户端浏览器的不同,返回不同的首页面。 RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* RewriteRule ^/$ /homepage.max.html [L] RewriteCond %{HTTP_USER_AGENT} ^Lynx.* RewriteRule ^/$ /homepage.min.html [L] RewriteRule ^/$ /homepage.std.html [L] 
    当你在地址栏里输入 sina.com.cn  google.cn

    看看有什么变化?是不是会自动跳转到 www.sina.com.cn    www.google.cn

    这一技术通过apache的rewrite可以实现,当然你得把 不带www的域名指向你服务器的IP

     要是虚拟主机的话,得在viralhost段加入 ServerAlias xxx.com

    然后打开重写引擎功能

     RewriteEngine On

    能过rewritecond判断主机名是否带www

    RewriteCond %{HTTP_HOST}  ^xxx\.com$ [NC]

    然后来一条

    RewriteRule ^/(.*)$  http://www.xxx.com/$1 [R=301,L]

    OK,重起apache,现在在浏览器中输入 xxx.com 看看是不是自动变成了 www.xxx.com 了呢。

    重新整理一下就是:

    RewriteEngine On

    RewriteCond %{HTTP_HOST} ^xxx\.com$ [NC]

    RewriteRule ^/(.*)$  http://www.xxx.com/$1 [R=301,L]

     

    源地址: http://blog.csdn.net/keyunq/archive/2008/06/11/2536875.aspx

    一 .RewriteRule

    Syntax: RewriteRule Pattern Substitution [flags]

      一条RewriteRule指令,定义一条重写规则,规则间的顺序 非常重要。对Apache1.2及以后的版本,模板(pattern)是一个POSIX正则式,用以匹配当前的URL。当前的URL不一定是用记最初提交 的URL,因为可能用一些规则在此规则前已经对URL进行了处理。


      对mod_rewrite来说,!是个合法的模板前缀,表示“非”的意思,这对描述“不满足某种匹配条件”的情况非常方便,或用作最后一条默认规则。当使用!时,不能在模板中有分组的通配符,也不能做后向引用。

      当匹配成功后,Substitution会被用来替换相应的匹配,它除了可以是普通的字符串以外,还可以包括: 
    1. $N,引用RewriteRule模板中匹配的
     相关 字串,N表示序号,N=0..9 
    2. %N,引用最后一个RewriteCond模板中匹配的数据,N表示序号 
    3. %{VARNAME},服务器变量 
    4. ${mapname:key|default},映射函数调用


    这些特殊内容的扩展,按上述顺序进行。
      一个URL的全部相关部分都会被Substitution替换,而且这个替换过程会一直持续到所有的规则都被执行完,除非明确地用L标志中断处理过程。
      当susbstitution有”-”前缀时,表示不进行替换,只做匹配检查。
       利用RewriteRule,可定义含有请求串(Query String)的URL,此时只需在Sustitution中加入一个?,表示此后的内容放入QUERY_STRING变量中。如果要清空一个 QUERY_STRING变量,只需要以?结束Substitution串即可。
      如果给一个Substitution增加一个

    1. 'redirect|R [=code]' (强制重定向)
      给当前的URI增加前缀

    2. 'forbidden|F' (强制禁止访问URL所指的资源)
      立即返回状态值403 (FORBIDDEN)的应答包。将这个标志与合适的RewriteConds 联合使用,可以阻断访问某些URL。

    3. 'gone|G' (强制返回URL所指资源为不存在(gone))
      立即返回状态值410 (GONE)的应答包。用这个标志来标记URL所指的资源永久消失了.

    4. # 'proxy|P' (强制将当前URL送往代理模块(proxy module))
      这个标志,强制将substitution当作一个发向代理模块的请求,并立即将共送往代理模块。因此,必须确保substitution串是一个合法的URI (如, 典型的情况是以

    5. 'last|L' (最后一条规则)
      中止重写流程,不再对当前URL施加更多的重写规则。这相当于perl的last命令或C的break命令。

    6. 'next|N' (下一轮)
      重新从第一条重写规则开始执行重写过程,新开的过程中的URL不应当与最初的URL相同。 这相当于Perl的next命令或C的continue命令. 千万小心不要产生死循环。

    7. # 'chain|C' (将当前的规则与其后续规则綑绑(chained))
      当规则匹配时,处理过程与没有綑绑一样;如果规则不匹配,则綑绑在一起的后续规则也不在检查和执行。

    8. 'type|T=MIME-type' (强制MIME类型)
      强制将目标文件的MIME-type为某MIME类型。例如,这可用来模仿mod_alias模块对某目录的ScriptAlias指定,通过强制将该目录下的所有文件的类型改为 “application/x-httpd-cgi”.

    9. 'nosubreq|NS' (used only if no internal sub-request )
       这个标志强制重写引擎跳过为内部sub-request的重写规则.例如,当mod_include试图找到某一目录下的默认文件时 (index.xxx),sub-requests 会在Apache内部发生. Sub-requests并非总是有用的,在某些情况下如果整个规则集施加到它上面,会产生错误。利用这个标志可排除执行一些规则。

    10. 'nocase|NC' (模板不区分大小写)

    这个标志会使得模板匹配当前URL时忽略大小写的差别。

    11. 'qsappend|QSA' (追加请求串(query string))
      这个标志,强制重写引擎为Substitution的请求串追加一部分串,则不是替换掉原来的。借助这个标志,可以使用一个重写规则给请求串增加更多的数据。

    12. 'noescape|NE' (不对输出结果中的特殊字符进行转义处理)
       通常情况下,mod_write的输出结果中,特殊字符(如'%', '$', ';', 等)会转义为它们的16进制形式(如分别为'%25', '%24', and '%3B')。这个标志会禁止mod_rewrite对输出结果进行此类操作。 这个标志只能在 Apache 1.3.20及以后的版本中使用。

    13. 'passthrough|PT' (通过下一个处理器)
       这个标志强制重写引擎用filename字段的值来替换内部request_rec数据结构中uri字段的值。. 使用这个标志,可以使后续的其它URI-to-filename转换器的Alias、ScriptAlias、Redirect等指令,也能正常处理 RewriteRule指令的输出结果。用一个小例子来说明它的语义:如果要用mod_rewrite的重写引擎将/abc转换为/def,然后用 mod_alas将/def重写为ghi,则要:
    RewriteRule ^/abc(.*) /def$1 [PT]
    Alias /def /ghi
    如 果PT标志被忽略,则mod_rewrite也能很好完成工作,如果., 将 uri=/abc/... 转换为filename=/def/... ,完全符合一个URI-to-filename转换器的动作。接下来 mod_alias 试图做 URI-to-filename 转换时就会出问题。
    注意:如果要混合都含有URL-to-filename转换器的不同的模块的指令,必须用这个标志。最典型的例子是mod_alias和mod_rewrite的使用。

    14. 'skip|S=num' (跳过后面的num个规则)
      当前规则匹配时,强制重写引擎跳过后续的num个规则。用这个可以来模仿if-then-else结构:then子句的最后一条rule的标志是skip=N,而N是else子句的规则条数。

    15. 'env|E=VAR:VAL' (设置环境变量)
       设置名为VAR的环境变量的值为VAL,其中VAL中可以含有正则式的后向引用($N或%N)。这个标志可以使用多次,以设置多个环境变量。这儿设置的 变量,可以在多种情况下被引用,如在XSSI或CGI中。另外,也可以在RewriteCond模板中以%{ENV:VAR}的形式被引用。

    16. 

       注意:一定不要忘记,在服务器范围内的配置文件中,模板(pattern)用以匹配整个URL;而在目录范围内的配置文件中,目录前缀总是被自动去掉后再 进行模板匹配的,且在替换完成后自动再加上这个前缀。这个功能对很多种类的重写是非常重要的,因为如果没有去前缀,则要进行父目录的匹配,而父目录的信息 并不是总能得到的。一个例外是,当substitution中有http://打头时,则不再自动增加前缀了,如果P标志出现,则会强制转向代理。

    注 意:如果要在某个目录范围内启动重写引擎,则需要在相应的目录配置文件中设置“RewriteEngine on”,且目录的“Options FollowSymLinks”必须设置。如果管理员由于安全原因没有打开FollowSymLinks,则不能使用重写引擎。

    http://hostname 开头),否则会从代理模块得到一个错误. 这个标志,是ProxyPass指令的一个更强劲的实现,将远程请求(remote stuff)映射到本地服务器的名字空间(namespace)中来。
       注意,使用这个功能必须确保代理模块已经编译到Apache 服务器程序中了. 可以用“httpd -l ”命令,来检查输出中是否含有mod_proxy.c来确认一下。如果没有,而又需要使用这个功能,则需要重新编译``httpd''程序并使用 mod_proxy有效。 http://thishost[:thisport]/ , 从而生成一个新的URL,强制生成一个外部重定向(external redirection,指生的URL发送到客户端,由客户端再次以新的URL发出请求,虽然新URL仍指向当前的服务器). 如果没有指定的code值,则HTTP应答以状态值302 (MOVED TEMPORARILY),如果想使用300-400(不含400)间的其它值可以通过在code的位置以相应的数字指定,也可以用标志名指定: temp (默认值), permanent, seeother.

    注意,当使用这个标志时,要确实substitution是个合法的URL,这个标志只是在URL前增加http://thishost[:thisport]/ 前缀而已,重写操作会继续进行。如果要立即将新URL重定向,用L标志来中重写流程。http://thishost[:port ]的前缀,则mod_rewrite会自动将此前缀去掉。因此,利用 http://thisthost 做一个无条件的重定向到自己,将难以奏效。要实现这种效果,必须使用R标志。
      Flags是可选参数,当有多个标志同时出现时,彼此间以逗号分隔。


    展开全文
  • URL地址重写项目

    2014-06-05 10:59:55
    伪静态URL重写是通过微软公司封装好了的一个URL重写组件(UrlReswriter.jar)来实现的,导入JAR包,在WEB服务中加载伪静态地址拦截器,客户端以静态地址向服务器发起请求,服务器端的拦截器拦截客户端请求,查找XML...
  • 在日常网站访问中,会把动态地址改造成伪静态地址。 例如: 访问新闻栏目 /col/1/,这是原有地址,如果这样访问,不利于搜索引擎检索收录,同时安全性也不是很好。 改造之后: /col/1.html。 改造方法: 1.添加...

    在日常网站访问中,会把动态地址改造成伪静态地址。

    例如: 访问新闻栏目 /col/1/,这是原有地址,如果这样访问,不利于搜索引擎检索收录,同时安全性也不是很好。

    改造之后:

    /col/1.html。

    改造方法:

    1.添加urlrewritefilter

    <dependency>
        <groupId>org.tuckey</groupId>
        <artifactId>urlrewritefilter</artifactId>
        <version>4.0.4</version>
    </dependency>

    2.配置bean

    import java.io.IOException;
    
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.Resource;
    import org.tuckey.web.filters.urlrewrite.Conf;
    import org.tuckey.web.filters.urlrewrite.UrlRewriteFilter;
    
    @Configuration
    public class UrlRewriteFilterConfig extends UrlRewriteFilter {
    
      private static final String URL_REWRITE = "classpath:/urlrewrite.xml";
    
      // Inject the Resource from the given location
      @Value(URL_REWRITE)
      private Resource resource;
    
      // Override the loadUrlRewriter method, and write your own implementation
      protected void loadUrlRewriter(FilterConfig filterConfig) throws ServletException {
        try {
          // Create a UrlRewrite Conf object with the injected resource
          Conf conf = new Conf(filterConfig.getServletContext(), resource.getInputStream(), resource.getFilename(),
              "@@traceability@@");
          checkConf(conf);
        } catch (IOException ex) {
          throw new ServletException("Unable to load URL rewrite configuration file from " + URL_REWRITE, ex);
        }
      }
    }

    参考网址:http://blog.jdriven.com/2016/02/urlrewritefilter-load-configuration-with-spring-resourceloader/

    3.配置urlrewrite.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
            "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
    
    <urlrewrite>
    
        <!-- 栏目首页 -->
        <rule>
            <from>^/col/(\w+)\.html$</from>
            <to>/col/$1/</to>
        </rule>
    
        <!-- 栏目列表页,注意html后面没有加$,因为后面还有若干参数 -->
        <rule>
            <from>^/col/list/(\w+)/(\w+)\.html</from>
            <to>/col/list/$1/$2/</to>
        </rule>
    
        <!-- 文章详情页 -->
        <rule>
            <from>^/art/(\w+)\.html$</from>
            <to>/art/$1/</to>
        </rule>
        
        <!-- 静态网页 -->
        <rule>
            <from>^/static/(\w+)\.html$</from>
            <to>/static/$1/</to>
        </rule>
    
    </urlrewrite>

    image

    配置说明请参考:http://blog.163.com/zhangmihuo_2007/blog/static/27011075201351433716225/

    至此配置完毕,启动测试,注意看红框处,说明加载了urlwrite。

    image

    访问页面如下,成功了!

    image

    转载于:https://www.cnblogs.com/huiy/p/7816060.html

    展开全文
  • urlrewrite url地址重写

    2010-03-18 10:46:14
    urlrewrite url地址重写  郁闷,还要我写够20个字。。我倒!
  • Urlrewrite地址重写

    千次阅读 2018-11-07 13:29:36
    UrlRewrite地址重写后,用户得到的全部都是经过处理后的URL地址。 一、它的主要优点 1.1、提高安全性,可以有效的避免一些参数名、ID等完全暴露在用户面前,如果用户随便乱输的话,不符合规则的话直接会返回个404...
  • C# URL重写 URL重定向 地址重写 .net源码 核心代码 简单易用源码
  • 该文件是一个asp.neturl地址重写的简单实例.
  • 2.url重写 UrlRewriteFilter可以完美的解决这个问题。 使用UrlRewriteFilter的步骤: a.下载jar包,添加jar包 jar包里封装好了路径过滤器类的实现,所以要用UrlRewriteFilter,一定要先...
  • 在ASP.NET中重写URL的代码
  • Windows IIS安装URL重写完整教程 包含 组件,安装配置(解决vue部署iis问题),组件安装失败解决方案
  • 本文记录了在IIS8下安装和使用URL Rewrite插件的步骤,详细举例说明如何使用URL重写工具实现301重定向的功能。 下载和安装URL Rewrite IIS8默认是没有安装URL重写工具的,必须要自己下载安装。 如果IIS上默认有安装...
  • Java WEB实现URL重写

    2018-05-22 09:32:47
    URL重写,其实就是把带一大堆参数的url,变成一个看上去很规矩的url。本例是URL重写的Java WEB实现。
  • 在实际项目中,我们将访问与后台约定的url地址进行访问系统,比如:http://localhost:9090/index.jsp、http://localhost:9090/idcAccessRoom/launchApplication 等。但在有的情况下,比如...
  • Nginx地址重写以及url重写

    千次阅读 2018-09-07 09:31:29
    1、Nginx地址重写 [root@localhost html]# echo aaaaaaa &gt; a.html [root@localhost html]# echo bbbbbb &gt; b.html [root@localhost nginx]# vim /usr/local/nginx/conf/nginx.conf server { listen...
  • URL实例 重写URL:http://www.baidu.com/?p=152 原始URL:http://www.baidu.com/p152.html ...^ 匹配行的开始,匹配URL地址的开头部分,对于RewriteRule而言,域名(http://www.biuuu.com)不是UR
  • 配置.htaccess文件实现URL地址重写

    千次阅读 2012-03-29 11:35:37
    很多站长朋友都注意到一个实现了URL地址静态化的动态网站往往在搜索引擎中能够获得一个好的排名。的确,在搜索引擎中随便搜索一个关键词,排名靠前的基本都是静态页面。这篇文章豆芽给大家介绍如果通过.htaccess文件...
  • 如果使用了URL重写,并通过Request.Url.AbsoluteUri获取当前网址,用户登录后打开的就是重写后的地址,这虽然不影响正常使用,但从用户体验及URL统一的角度,我们更希望是重写前的地址。  之前,我们在开发中也被这...
  • urlrewrite实现地址重写

    千次阅读 2016-05-03 15:16:52
    现在的web开发里面,对于地址重写运用的较为广泛,他的意义很大,一是可以优化搜索,将所有的请求我们可以写成后缀为.htm或.html的方式,而是可以隐藏真实的请求地址对于系统而言是安全的,所以接下来就介绍一下他...
  • 主要介绍了UrlRewrite 重写url详解及实例的相关资料,重写能美化,提高安全,有利于搜索引擎的收入等,需要的朋友可以参考下
  • 使用jstl标签库实现URL地址重写

    千次阅读 2017-03-01 16:46:16
    它具有URL自动重写功能。value指定的URL可以是当前工程的一个URL地址,也可以是其他web工程的URL。但是这时需要context属性。也可以添加需要传递的参数。 属性 var :变量名称value:要格式化的URLscope:...
  • 现在主流的项目都在使用SpringMVC了,今天就结合SpringMVC和UrlRewrite来实现URL地址重写,实现伪静态 首先我们要导入UrlRewrite的所需 Jar包,这里使用Maven方式导入:在pom.xml中添加以下代码 <!-- URL ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 231,132
精华内容 92,452
关键字:

url地址重写