Apache .htaccess
2019-08-02 本文已影响0人
wpf_register
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]
举例
- 图片重定向
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
- 示例
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)