• htaccess URL重写rewrite与重定向redirect

    常见的八个重写需求
    服务器君一共花费 26.795 ms 进行了 4 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    接下来就是实践练习了。

    1. 将 .htm 页面映射到 .php

    Options +FollowSymlinks
    RewriteEngine on
    RewriteRule ^(.*)\.htm$ $1.php [NC]
    

    如果正则不是很熟悉,可以参考下《正则表达式入门》

    一些注意事项:

    • 该RewriteRule能够将.htm静态页面映射到.php动态页面。
    • 如果通过.htm进入,浏览器地址栏显示的是.htm扩展名,但服务器上实际执行的是.php。
    • 必须保证服务器上有对应的.php,否则会404。
    • 浏览器和搜索引擎可以同时通过.htm和.php访问网页。
    • 如果该目录上存在.htm,将被忽略。
    • [NC]表示“不区分大小写”。

    2. 临时重定向(R=302)

    RewriteEngine on
    RewriteBase /
    RewriteRule ^(.*)\.htm$ $1.php [R,NC,L]
    

    一些注意事项:

    • 该RewriteRule能够将.htm静态页面重定向到.php动态页面。
    • 如果通过.htm进入,浏览器地址栏会自动转为.php(请与上面的[NC]区别开来),这也是重定向的本质。
    • 必须保证服务器上有对应的.php,否则会404。
    • 浏览器和搜索引擎可以同时通过.htm和.php访问网页。
    • 如果该目录上存在.htm,将被忽略。
    • RewriteBase定义了重写基准目录。例如,如果你将虚拟站点设置在/var/www目录下,删除这行将会导致重定向到http://yourdomain.com/var/www/1.php。显然这是找不到的,而且你也不会希望用户看见你的服务器的目录结构。
    • 再举个例子,如果RewriteBase /base/,那么将会重定向到http://yourdomain.com/base/1.php。
    • 对于重写基准目录,我们还可以通过将$1.php变成/$1.php实现直接变换,这时就可以将RewriteBase省略。
    • 字母R表示临时重定向,相当于[R=302,NC]。
    • 字母L表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则。

    3. 永久重定向(R=301)

    在讨论R=302临时重定向后,理解R=301永久重定向也就容易多了:

    RewriteEngine on
    RewriteRule ^(.*)$ http://www.nowamagic.net/$1 [R=301,NC,L]
    
    • 这个规则告诉浏览器和搜索引擎,网站地址发生了永久性变更,用户的URL请求将会被发送给新的域名(主机)处理。
    • 由于是重定向到新的主机地址,RewriteBase也就没有出现的必要了。

    4. 为什么要用重定向?

    重定向和URL重写的区别:

    • 通过重定向,浏览器知道页面位置发生变化,从而改变地址栏显示的地址。
    • 通过重定向,搜索引擎意识到页面被移动了,从而更新搜索引擎索引,将原来失效的链接从搜索结果中移除。
    • 临时重定向(R=302)和永久重定向(R=301)都是亲搜索引擎的,是SEO的重要技术。
    • URL重写用于将页面映射到本站另一页面,若重写到另一网络主机(域名),则按重定向处理。

    5. 长短地址转换

    利用URL重写,我们可以很方便地实现长短地址的转换,但是用重定向就不合适了。

    RewriteEngine On
    RewriteRule ^grab /public/files/download/download.php
    

    若访问 http://mysite/grab?file=my.zip,则会执行该页面:http://mysite/public/files/download/download.php?file=my.zip

    6. 去掉www

    Options +FollowSymlinks
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,NC,L]
    

    7. 加上www

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(.*)$
    RewriteRule (.*) http://www\.%1/$1 [R=301,L]
    

    8. 支持多域名访问

    如果你不凑巧买到了不支持多域名的主机,那么.htaccess或许可以帮助你。现在假设你有域名domain-one.com和domain-two.com,并且在服务器根目录有对应文件夹one和two,那么通过下面的改写就能让Apache同时接受者两个域名的请求:

    #two domains served from one root..
    RewriteCond %{HTTP_HOST} domain-one.com
    RewriteCond %{REQUEST_URI} !^/one
    RewriteRule ^(.*)$ /one/$1 [L]
    
    RewriteCond %{HTTP_HOST} domain-two.com
    RewriteCond %{REQUEST_URI} !^/two
    RewriteRule ^(.*)$ /two/$1 [L]
    
    • 上面介绍了.htaccess 常见的八个重写功能,当然还有更多,但大部分都可以从这里延伸出来。你也可以从这里启发,用 htaccess 实现更多的功能。
更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [PHP程序设计] PHP扩展模块安装 1 个条目
  2. [C语言程序设计] 结构体基本知识 1 个条目
  3. [移动开发] Activity 初步知识 2 个条目
  4. [移动开发] 从代码角度去认识 Thread 9 个条目
  5. [Python程序设计] Tornado背景知识介绍 4 个条目
  6. [Python程序设计] Python Web部署的背景知识 9 个条目
  7. [Python程序设计] Django 入门知识浅介 10 个条目
  8. [软件工程与项目管理] 浏览器初步介绍 8 个条目
  9. [移动开发] Content Provider内容提供者 3 个条目
  10. [软件工程与项目管理] 呈现树的构建 13 个条目
  11. [Python程序设计] Tornado 服务器环境配置 3 个条目
  12. [移动开发] Android抽屉导航NavigationDrawer 5 个条目
窗口 -- [协会]