apache rewrite 参数和例子

本文介绍了Apache mod_rewrite模块的重写规则标志及其应用。详细解释了如R、F、G等标志的作用,并通过多个实际案例展示了如何实现URL重定向、URL规范统一、防盗链等功能。

apache rewrite 参数和例子

‍1.Apache mod_rewrite重写规则的标志

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

2.服务器变量                                                                   

HTTP headers: connection & request:

    HTTP_USER_AGENT
    HTTP_REFERER
    HTTP_COOKIE
    HTTP_FORWARDED
    HTTP_HOST
    HTTP_PROXY_CONNECTION
    HTTP_ACCEPT
    REMOTE_ADDR
    REMOTE_HOST
    REMOTE_USER
    REMOTE_IDENT
    REQUEST_METHOD
    SCRIPT_FILENAME
    PATH_INFO
    QUERY_STRING
    AUTH_TYPE
server internals: system stuff: specials:
    DOCUMENT_ROOT
    SERVER_ADMIN
    SERVER_NAME
    SERVER_ADDR
    SERVER_PORT
    SERVER_PROTOCOL
    SERVER_SOFTWARE
    TIME_YEAR
    TIME_MON
    TIME_DAY
    TIME_HOUR
    TIME_MIN
    TIME_SEC
    TIME_WDAY
    TIME
    API_VERSION
    THE_REQUEST
    REQUEST_URI
    REQUEST_FILENAME
    IS_SUBREQ 

3.举例说明

例一.把client请求的主机前缀不是www.owjee.com和70.40.213.183都跳转到主机前缀为http://www.owjee.com,避免相同内容的网页有多个指向的域名如http://owjee.com

     NameVirtualHost 70.40.213.183:80
     ServerAdmin 
     DocumentRoot “/web”
     ServerName kiya.cn
     RewriteEngine on                              #打开rewirte功能
     RewriteCond %{HTTP_HOST} !^www.owjee.com [NC]   #声明Client请求的主机中前缀不是www.owjee.com,其中 [NC] 的意思是忽略大小写
     RewriteCond %{HTTP_HOST} !^70.40.213.183 [NC] #声明Client请求的主机中前缀不是70.40.213.183,其中 [NC] 的意思是忽略大小写
     RewriteCond %{HTTP_HOST} !^$                  #声明Client请求的主机中前缀不为空
     RewriteRule ^(.*) http://www.owjee.com [L]     #含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.owjee.com这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.

例二.将输入en.owjee.com的域名时跳转到http://www.owjee.com

     RewriteEngine on
     RewriteCond %{HTTP_HOST} ^en.owjee.com [NC]
     RewriteRule ^(.*) http://www.owjee.com[L]

例三.新域名为www.sicasoft.com,这时需要将原来的域名ss.kiya.cn, 以及论坛所在地址ss.kiya.cn/bbs/定向到新的域名,以便用户可以找到,并且使原来的论坛URL继续有效而不出现404未找到.

     RewriteEngine On
     RewriteCond %{REQUEST_URI} ^/bbs/
     RewriteRule ^bbs/(.*) http://bbs.sicasoft.com/$1 [R=permanent,L]
     RewriteCond %{REQUEST_URI} !^/bbs/
     RewriteRule ^(.*) http://www.sicasoft.com/$1 [R=permanent,L]


例四.同时达到下面两个要求:
1.用http://www.zzz.com/xxx.php 来访问 http://www.zzz.com/xxx/
2.用http://yyy.zzz.com 来访问 http://www.zzz.com/user.php?username=yyy 的功能

     RewriteEngine On
     RewriteCond %{HTTP_HOST} ^www.zzz.com
     RewriteCond %{REQUEST_URI} !^user.php$
     RewriteCond %{REQUEST_URI} .php$
     RewriteRule (.*).php$ http://www.zzz.com/$1/ [R]
     RewriteCond %{HTTP_HOST} !^www.zzz.com
     RewriteRule ^(.+) %{HTTP_HOST} [C]
     RewriteRule ^([^.]+).zzz.com http://www.zzz.com/user.php?username=$1

例五.首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如把 *.kiya.us和 *.kiya.cn全部解析到了IP地址70.40.213.183上。Apache中关于*.kiya.us的虚拟主机的设定。

     ServerAdmin 
     DocumentRoot /home/www/www.kiya.us
     ServerName dns.kiya.us
     ServerAlias dns.kiya.us kiya.us *.kiya.us
     CustomLog /var/log/httpd/osa/access_log.log” common
     ErrorLog /var/log/httpd/osa/error_log.log”
     AllowOverride None
     Order deny,allow
     #AddDefaultCharset GB2312
     RewriteEngine on
     RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$
     RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
     RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/www.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]


例六.Rewrite防盗链正则,不允许这两个网站盗链,其它的网站都可以盗链的规则怎么写.

     RewriteEngine On
     RewriteCond %{HTTP_REFERER} chinaz.com [NC]
     RewriteCond %{HTTP_REFERER} im286.com [NC]
     RewriteRule .*\.(jpg|jpeg|gif|png|rar|zip|txt|ace|torrent|gz|swf)$ http://www.xxx.com/fuck.png [R,NC,L]

列七.两个关于判断USER AGENT 例子和自动添加.php扩展名及自动换.html到.php扩展名的例子:

     RewriteEngine on
     RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
     RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
     RewriteRule ^.* – [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。

     RewriteEngine On
     RewriteBase /test
     RewriteCond %{REQUEST_FILENAME}.php -f
     RewriteRule ([^/]+)$ /test/$1.php
     #for example: /test/admin => /test/admin.php
     RewriteRule ([^/]+)\.html$ /test/$1.php [L]
     #for example: /test/admin.html => /test/admin.php

     限制目录只能显示图片
     < IfModule mod_rewrite.c>
     RewriteEngine on
     RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$
     RewriteRule .*$ – [F,L]
     < /IfModule>


例八.关于特定文件扩展名的重写。

     重写有某些扩展名的文件:
     RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L]
     如果要排除一些扩展名:
     RewriteRule !\.(js|ico|gif|jpg|JPG|png|PNG|css|pdf|swf)$ index.php

### Apache Rewrite规则实战 #### 实战案例分析 当处理URL重写需求时,Apache的`mod_rewrite`模块提供了强大的功能来实现复杂的URL转换。通过配置`.htaccess`文件或主配置文件中的指令集,可以灵活控制HTTP请求的行为。 对于具体的应用场景,考虑一个简单的例子:假设有一个网站希望将旧版本页面路径 `/old/path/to/resource.html` 转向至新结构下的对应位置 `/new/path/to/resource.php` 。这可以通过定义一条基本的 `RewriteRule` 来完成: ```apache RewriteEngine On RewriteBase / RewriteRule ^old/path/to/(.*)\.html$ /new/path/to/$1.php [R=301,L] ``` 此段代码首先启用了重写引擎并设定了基础目录;接着利用正则表达式模式匹配任何以 `.html` 结尾且位于指定子路径内的资源,并将其永久性地(状态码301)转向到新的PHP脚本地址[^1]。 #### 复杂条件判断与变量应用实例 更进一步,在某些情况下可能需要基于查询字符串或其他环境因素决定如何处理请求。例如,下面的例子展示了如何根据特定参数的存在与否执行不同的动作: ```apache RewriteCond %{QUERY_STRING} ^t/=(.+)?$ [NC] RewriteRule ^/api$ http://www.sina.com.cn?t=%1 [P] ``` 这里使用了 `%{QUERY_STRING}` 变量检测 URL 中是否含有形如 `t/=value` 的查询项。如果存在,则会代理转发给新浪网的服务接口,并传递原始参数值作为附加信息[^2]。 #### 完整流程验证 为了确保配置生效,通常还需要测试整个过程。比如在一个虚拟主机环境中模拟域名解析指向本地服务器后,尝试访问预设的目标站点链接 `http://www.rewrite.rewrite.com` ,观察浏览器返回的结果是否符合预期 —— 即被正确引导到了目标域 `http://www.rewrite.com` 并带有临时跳转的状态码 302[^3]。 #### 参数化路由映射示例 最后来看一个涉及多级动态参数的情况: ```apache RewriteRule ^/([0-9]+)/yunan/(.+)$ /index.php?tid=$1&items=$2 [L,R=301] ``` 这条规则能够捕获两个部分的数据片段分别赋值给 PHP 文件里的 GET 请求参数 `tid` `items`,从而实现了从静态外观风格的 URL 到实际应用程序内部逻辑之间的无缝过渡[^4]。 #### 高级特性运用 除了上述常规用途外,还可以借助于各种标志位增强灵活性。例如,采用不区分大小写的比较方式 (`nocase|NC`) 或者允许后续条件继续评估(`ornext|OR`)等选项来构建更加精细的选择机制[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值