Apache .htaccess详解

URL 重定向

URL重定向(URL redirection,或称网址重定向或网域名称转址),是指当使用者浏览某个网址时,将他导向到另一个网址的技术。

URL 重定向配置

  • apache开启重定向,修改httpd.conf配置

 

Options FollowSymLinks 
AllowOverride None
改为: 
Options FollowSymLinks 
AllowOverride All
  • 去掉下面的注释

 

LoadModule rewrite_module modules/mod_rewrite.so      //去掉行前的#
  • 重定向的配置文件位置
    第一种是在httpd.conf中写,适合有服务器完整权限的网站管理员

 

<VirtualHost *:80>
    ServerAdmin yangjx009@139.com
    DocumentRoot "/websites/www"
    ServerName localhost
    RewriteEngine On
    RewriteRule ^index\.html$ index.php [L]
</VirtualHost>

第二种在网站目录中使用.htaccess,这种方法适合采用虚拟主机形式的网站管理员,

基本正则表达式

因为URL重定向语法中大量使用了正则表达式,下面是基本的正则写法:

 

.    换行符以外的所有字符
 
\w   匹配字母或数字或下划线或汉字
 
\s   匹配任意的空白符
 
\d   匹配数字
 
\b   匹配单词的开始或结束
 
 ^   匹配字符串的开始
 
 $   匹配字符串的结束
 
 *   重复零次或更多次
 
 +   重复一次或更多次
 
 ?   重复零次或一次
 
 {n}         重复n次
 
 {n,}        重复n次或更多次
 
 {n,m}       重复n到m次
 
 () $1 $2    一个括号代表一个分组,第一个括号里匹配的内容就用$1引用,第二个括号匹配的内容用$2引用,以此类推......

.htaccess都可以做什么

主要包括:文件夹密码保护、用户自定义重定向、自定义404页面、扩展名伪静态化、禁止特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,等等

.htaccess语法规则

 

//RewriteEngine  用于开启或停用rewrite功能 On|Off
RewriteEngine On
/*
RewriteBase用于设定重写的基准URL。
设定基准目录,例如希望对根目录下的文件rewrtie,就是”/”

在对一个新的URL进行替换时,此模块必须把这个URL重新注入到服务器处理中。
为此,它必须知道其对应的URL前缀或者说URL基准。
通常,此前缀就是对应的文件路径。
但大多数网站URL不是直接对应于其物理文件路径的,因而一般不能做这样的假定! 
所以在这种情况下,
就必须用RewriteBase指令来指定正确的URL前缀。
如果你的网站服务器URL不是与物理文件路径直接对应的,
而又需要使用RewriteBase指令,则必须在每个对应的.htaccess文件中指定 RewriteRule 。
*/
RewiteBase /

/*
RewriteCond TestString CondPattern [flags]

1、RewriteCond:
指令定义了一个规则的条件,
在一个RewriteRule指令之前有一个或多个RewriteCond指令。 
条件之后的重写规则仅在当前URI与pattern匹配并且符合这些条件的时候才会起作用。
2、TestString: 
  是一个纯文本的字符串,但是还可以包含下列可扩展的成分:
3、RewriteRule反向引用:
  引用方法是 $N  (0 <= N <= 9) 引用当前(带有若干RewriteCond指令的)RewriteRule中的 与pattern匹配的分组成分(圆括号!)。
4、RewriteCond反向引用: 
  引用方法是 %N  (1 <= N <= 9) 引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。
5、RewriteMap 扩展: 
 引用方法是 ${mapname:key|default}
6、服务器变量: 
  引用方法是 %{ NAME_OF_VARIABLE }  这个是我们最常使用到的功能
7、CondPattern:
  是条件pattern, 即, 一个应用于当前实例TestString的正则表达式, 即, TestString将会被计算然后与CondPattern匹配.
可以在pattern串中使用!字符(惊叹号)来实现匹配的反转。
8、flags 参见原文链接
*/
//如果来源网址不是*.baidu.com
RewriteCond %{HTTP_REFERER} !^http://(.+.)?baidu.com/ [NC]    
//并且来源网址不是空   
RewriteCond %{HTTP_REFERER} !^$      


/*
RewriteRule Pattern Substitution [Flags]
其中的Pattern就是参数,一般为一些文件的扩展名;
Substitution是用来替换前面用的;
Flags,常用的R表示 redirect(强制重定向),
F表示forbidden(禁止访问),
L表示last(最后)通常当你希望停止重写操作而立即重定向时。
*/
 //如果访问的文件后缀是jpeg,jpg,gif,bmp,png的图片,则重定向到一个固定的图片                             
RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]    

举例

  1. 图片重定向

 

RewriteEngine On
 //如果域名是localhost
RewriteCond %{HTTP_HOST} ^localhost$   
 //并且访问的文件找不到
RewriteCond %{REQUEST_FILENAME} !-f    

 //则跳转到另一个域名下的另一个目录访问这个图片
RewriteRule ^images/(.+) http://127.0.0.1/test/showimages/$1 [R=302,L]    

2、二级域名重定向到www.yourdomain.com

 

rewriteEngine on
rewriteCond %{http_host} ^yourdomain.com [NC]
rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

3.设置目录默认页面

 

DirectoryIndex about.html
  1. 示例

 

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^article-(.*)$ index.php/Home/Article/detail/id/$1 [L,NC]
RewriteRule ^index-(.*)-(.*).html$ index.php/Home/Article/index/pid/$1/cid/$2 [L,NC]
RewriteRule ^index-(.*).html$ index.php/Home/Article/index/cid/$1 [L,NC]
RewriteRule ^page-(.*).html$ index.php/Home/Article/page/cid/$1 [L,NC]
RewriteRule ^Article/(.*)$ index.php/Article/$1 [L,NC]
RewriteRule ^Admin$ index.php?m=Admin&c=Public&a=index [L,NC]

附1: Rewrite标志

 

    R[=code](force redirect) 强制外部重定向
    G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
    P(force proxy) 强制使用代理转发。
    L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
    N(next round) 重新从第一条规则开始运行重写过程。
    C(chained with next rule) 与下一条规则关联
    如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过
    T=MIME-type(force MIME type) 强制MIME类型
    NS (used only if no internal sub-request) 只用于不是内部子请求
    NC(no case) 不区分大小写
    QSA(query string append) 追加请求字符串
    NE(no URI escaping of output) 不在输出转义特殊字符
    例如:
    RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed
    PT(pass through to next handler) 传递给下一个处理
    例如:
    RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
    Alias /def /ghi
    S=num(skip next rule(s)) 跳过num条规则
    E=VAR:VAL(set environment variable) 设置环境变量

附2:RewriteCond标志符

 

'nocase|NC'(no case)忽略大小
'ornext|OR' (or next condition)逻辑或,可以同时匹配多个RewriteCond条件RewriteRule适用的标志符
'redirect|R [=code]' (force redirect)强迫重写为基于http开头的外部转向(注意URL的变化) 如:[R=301,L]
'forbidden|F' (force URL to be forbidden)重写为禁止访问
'proxy|P' (force proxy)重写为通过代理访问的http路径
'last|L' (last rule)最后的重写规则标志,如果匹配,不再执行以后的规则
'next|N' (next round)循环同一个规则,直到不能满足匹配
'chain|C' (chained with next rule)如果匹配该规则,则继续下面的有Chain标志的规则。
'type|T=MIME-type' (force MIME type)指定MIME类型
'nosubreq|NS' (used only if no internal sub-request)如果是内部子请求则跳过
'nocase|NC' (no case)忽略大小
'qsappend|QSA' (query string append)附加查询字符串
'noescape|NE' (no URI escaping of output)禁止URL中的字符自动转义成%[0-9]+的形式。
'passthrough|PT' (pass through to next handler)将重写结果运用于mod_alias
'skip|S=num' (skip next rule(s))跳过下面几个规则

附3:Rewrite规则表达式的说明

 

    . 匹配任何单字符
    [chars] 匹配字符串:chars
    [^chars] 不匹配字符串:chars
    text1|text2 可选择的字符串:text1或text2
    ? 匹配0到1个字符
    * 匹配0到多个字符
    + 匹配1到多个字符
    ^ 字符串开始标志
    $ 字符串结束标志
    n 转义符标志
    反向引用 $N 用于 RewriteRule 中匹配的变量调用(0 <= N <= 9)
    反向引用 %N 用于 RewriteCond 中最后一个匹配的变量调用(1 <= N <= 9)



作者:wpf_register
链接:https://www.jianshu.com/p/b15390388b14
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值