分类 rewrite 下的文章

apache重写模块学习(3)

对YYYY转变为XXXX的向前兼容

描述:
在转变了大批document.YYYY文件为document.XXXX后(比如.html→.phtml),如何保持URL的向前兼容(仍然虚拟地存在)?
解决方案:
只须按基准文件名重写,并测试带有新的扩展名的文件是否存在,如果存在则用新的,否则仍然用原来的。

将document.html重写为document.phtml的向后兼容的规则集
当且仅当document.phtml存在且document.html不存在的时候
RewriteEngine on
RewriteBase /~quux/
# 剪切并记住basename
RewriteRule ^(.*)\.html$ $1 [C,E=WasHTML:yes]
# 如果存在的话就重写为document.phtml
RewriteCond %{REQUEST_FILENAME}.phtml -f
RewriteRule ^(.*)$ $1.phtml [S=1]
# 否则返回先前的basename
RewriteCond %{ENV:WasHTML} ^yes$
RewriteRule ^(.*)$ $1.html

昨天在家里安装例子配置的死活不行,后来还是改动了下代码才实现的

RewriteEngine on
#RewriteCond %{EVN:html} !^ok$
RewriteRule ^(.*)\.html $1 [C,E=html:ok]
RewriteCond %{REQUEST_FILENAME}.phtml -f
RewriteRule (.*) $1.phtml [S=1]
#RewriteBase /mod_rewrite_test/
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule (.*) $1.html 

今天来公司,试试,竟然是ok的。。。,贴上公司代码

RewriteEngine on
RewriteBase /
# 剪切并记住basename
RewriteRule ^(.*)\.html$ $1 [C,E=html:yes]
# 如果存在的话就重写为document.phtml
RewriteCond %{REQUEST_FILENAME}.phtml -f
RewriteRule ^(.*)$ $1.phtml [S=1]
# 否则返回先前的basename
RewriteCond %{ENV:html} ^yes$
RewriteRule ^(.*)$ $1.html

公司和家里不同的地方是,xampps,公司是用的wampserver,不知道是不是apache版本的不同。。。。或者是其他的什么原因。。。
在公司配置的时候,是成功了,但是,.phtml的文件的html标签不会被解析成html标签,会原样输出,找的的解决办法是
打到Apache主配置文件,搜索“AddType text/html .shtml”:

#AddType text/html .shtml .html .htm  
#AddOutputFilter INCLUDES .shtml .html .htm  

把这两行前面的#去掉。然后重启Apache,可以解析html文件了。
没有按照上面的做,而是另起了一行

AddType text/html .phtml

再在公司电脑上面安装了同一个版本的xampps,也是ok的。。。。。。估计是昨天哪里写的不对

新旧文件的替换
http://test.com/a.html,访问这个网址的时候,正常应该访问网站根目录下的a.html文件,但是需要一个效果,在访问上面url的时候,实际访问的是网站根目录下的b.html文件代码如下

RewriteEngine on
RewriteRule ^a\.html$ b.html 

上面这样的是可以的,并且浏览器的url也不会改变,依然是http://test.com/a.html,但是如果想要在访问的文件改变的同时,使浏览器的url也发生变化,那就需要重定向的指令
代码如下

RewriteEngine on
RewriteRule ^a\.html$ b.html [R]

可是这句代码报错了,并且浏览器的url变成了http://test.com/D:/xampps/htdocs/test/b.html
然后加上***rewrite base / *** 就是ok的了
结合http://apache.jz123.cn/rewrite/rewrite_tech.html的说明,我想,在进入目录级的htaccess文件下的处理的时候,其实url已经转换成文件实际路径了,在进行替换也是对文件路径的替换,而不是替换url,所以才会出现在重定向的时候,url里面包含的是文件的路径,加上rewrite base之后,在进入的htaccess文件的时候,路径会被转变回url,再进行替换,就是ok的了,rewrite base 还有就是会加在重写后的url前面

apache重写模块学习(2)

下面的一些操作都是在windows下进行的
1.在多个目录中搜索页面

RewriteEngine On
RewriteCond      D:/wamp/wamp/www/m.xxx.cn/c/%{REQUEST_URI} -f
RewriteRule ^(.*) /c/$1 [L]
RewriteCond      D:/wamp/wamp/www/m.xxx.cn/a/%{REQUEST_URI} -f
RewriteRule ^(.*) /a/$1 [L]
RewriteCond      D:/wamp/wamp/www/m.xxx.cn/b/%{REQUEST_URI} -f
RewriteRule ^(.*) /b/$1 [L]

URL是http://m.xxx.cn/b.html,在a目录下是b目录和网站的根目录下都是有b.html这个文件的,但是因为这样的规则,回去访问a目录下的b.html文件
RewriteCond中的%{REQUEST_URI}应该是代表的/b.html,因为%{REQUEST_URI}前面的的那个/去掉也是可以正常起作用的,前面的路径部分好像是一定要写成绝对路径,相对路径我试了下不行,或者是还不知道相对路径的写法应该是怎样写
REQUEST_URI是代表的网址部分的'/b.html'的内容
来测一测
在网站的根目录下的htaccess文件下设置

RewriteEngine On
RewriteRule ^zj http://www.baidu.com [R,L]

当url是m.xxx.cn/zj的时候会实现跳转
改写规则

RewriteRule ^\/zj http://www.baidu.com [R,L]

或者

RewriteRule ^/zj http://www.baidu.com [R,L]

再在网站根目录下的a文件夹下的htaccess文件中设置

RewriteEngine On
RewriteRule ^zj http://www.baidu.com [R,L]

当url为m.xxx.cn/a/zj才会跳转
RewriteRule的^(.*)里面的查找字符串是从当前文件夹之后的字符串,比如
url:http://www.xxxx.com/a/b/c
在网站根目下的hataccess文件的查找字符串是基于a/b/c
在网站根目下的a文件下的hataccess文件的查找字符串是基于b/c
2.虚拟用户主机
描述:
如果需要为用户username支持一个***www.username.host.domain.com***的主页,但不在此机器上建虚拟主机,而是仅用在此机器上增加一个DNS A记录的方法实现。
解决方案:
仅能对包含"Host: "头的HTTP/1.1请求实现。可以使用以下规则集内部地将***http://www.username.host.com/anypath***重写为***/home/username/anypath***

RewriteEngine on
RewriteCond   %{HTTP_HOST}                 ^www\.[^.]+\.host\.com$
RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]
RewriteRule   ^www\.([^.]+)\.host\.com(.*) /home/$1$2

我自己测试的时候是
访问http://www.xxx.baidu.com/index.html实际访问的是根目录下xxx/xxx/index.html,用这个上面的代码不行,会造成死循环,不知道是不是因为环境不一样的原因,我就自己改了下

RewriteEngine On
RewriteCond   %{HTTP_HOST}          ^www\.([a-zA-Z_]*)\.baidu\.com$
RewriteCond   %{REQUEST_FILENAME}   !-f
RewriteRule   ^(.*)                 %{HTTP_HOST}$1          [C]
RewriteRule   ^www\.([^.]+)\.baidu\.com\/?(.*) $1/$1/$2 

加了一句判断,就不会进入死循环了,但是如果访问的文件里面的那个文件不存在的话,还是会进入死循环,例如现在的url是http://www.xxx.baidu.com/index.html,按照上面的规则的话就会去访问根目录下a/index.html,如果文件正常存在的话,可以正常访问,但是如果文件是不存在的,就会进入死循环,不知道有没有更好的方法,使文件不存在的时候不是显示死循环的信息(403)而是进入404页面????

http://apache.jz123.cn/rewrite/index.html

apache 重写模块学习(1) alias,RewriteBase用法

Alias的用法
在本地windows上建立的虚拟主机如下

<VirtualHost *:80>
    ServerName    m.xxx.cn
    ServerAlias   m.xxx.cn
    DocumentRoot "D:/wamp/wamp/www/m.xxx.cn/"
    #这里配置欢迎首页面 
    DirectoryIndex index.html index.htm index.php 
    Alias /m/ 'D:/wamp/wamp/www/m.xxx.cn/n/'#这里是alias配置
    <Directory />
    Options FollowSymLinks
    #不许可别人修改我们的页面
    AllowOverride None
    #设置访问权限
    Order allow,deny
    Allow from all
    </Directory>
</VirtualHost>

alias配置如下

Alias /m/ 'D:/wamp/wamp/www/m.xxx.cn/n/'

现在浏览http://m.xxx.cn/m/b.html,正常情况应该是会访问D:/wamp/wamp/www/m.xxx.cn/m/b.html文件,但是因为配置了alias所以不会访问m目录下的内容,而是会访问n目录下的内容
RewriteBase的用法
通过上面的设置,在访问http://m.xxx.cn/m/index.html的时候,实际访问的是D:/wamp/wamp/www/m.xxx.cn/n/index.html文件
在访问http://m.xxx.cn/m/index.html的时候访问的是D:/wamp/wamp/www/m.xxx.cn/n/a.html
则可以进行如下的htaccess文件配置

RewriteEngine On
RewriteRule ^index\.html\/?$ a.html

然后,如果我想在访问这个网址的时候,访问的是网站根目录下的地址怎么办?

RewriteEngine On
RewriteBase /
RewriteRule ^index\.html\/?$ a.html

这样,访问的就是D:/wamp/wamp/www/m.xxx.cn/a.html
在网站根目录下新建了一个f目录
修改n下的htaccess文件如下

RewriteEngine On
RewriteBase /f/
RewriteRule ^index\.html\/?$ a.html

这时,访问http://m.xxx.cn/m/index.html实际访问的是D:/wamp/wamp/www/m.xxx.cn/f/a.html
```
我想,RewriteBase这个东西的作用应该大致了解了,访问的文件的真实的路径应该就是RewriteBase(没写就相当于设置的当前目录)+RewriteRule后半部分的内容

apache 参数说明

转载自http://blog.csdn.net/Zhao1234567890123456/article/details/38569139

1、Rewrite简介

Rewirte主要的功能就是实现URL的跳转,隐藏URL真实地址,可以帮组我们实现拟静态,拟目录,域名跳转,防止盗链,搜索引擎得收录等。Rewirte配置可以通过服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式实现。

2、APache配置Rewrite(windows下)

服务器级:

[1]打开Apache的配置文件httpd.conf,将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉;
[2]在httpd.conf中添加如下代码

<IfModule mod_rewrite.c>
RewriteEngine On 
#这里编写rewrite规则,具体语法,下面会详细描述
</IfModule> 

[3]重启Apache即可。

目录级(.htaccess):

[1]打开Apache的配置文件httpd.conf,将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉;
[2]让Apache支持.htaccess,需要将httpd.conf中的

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

修改为:

<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>

[3]创建.htaccess,创建方法为用记事本打开点击文件–另存为,在文件名窗口输入“.htaccess”,一定要加上“.”。
[3]将创建的.htaccess拷贝到网站程序的根目录下即可。
[4].htaccess中的内容如下:

<IfModule mod_rewrite.c> 
RewriteEngine On 
#这里编写rewrite规则,具体语法,下面会详细描述
</IfModule> 

3、服务器变量

[1]HTTP headers 部分参数

HTTP_USER_AGENT

样例参考值: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8
说明: 相当于PHP中的服务器参数: $_SERVER["HTTP_USER_AGENT"]

HTTP_REFERER

样例参考值: http://www.test.cn/test.php
说明: 相当于PHP中的服务器参数: _SERVER["HTTP_REFERER"]

HTTP_COOKIE

样例参考值: ZDEDebuggerPresent=php,phtml,php3
说明: 相当于PHP中的服务器参数: $_SERVER["HTTP_COOKIE"]

HTTP_FORWARDED

样例参考值: 如果使用代理服务器的话会是代理服务器的IP地址, 本地不容易搭环境测试出值来.
说明: 相当于PHP中的服务器参数: $_SERVER["HTTP_FORWARDED"]

HTTP_HOST

样例参考值: www.test.com
说明: 相当于PHP中的服务器参数: $_SERVER["HTTP_HOST"]

HTTP_PROXY_CONNECTION

样例参考值: 网络连接代理方面的信息. 和HTTP_FORWARDED参数一样. 本地不容易搭环境测试出值来.
说明: PHP中貌似未提供这样的服务器信息值. 如果又的话可能等值于: $_SERVER["HTTP_PROXY_CONNECTION"]

HTTP_ACCEPT

样例参考值: text/html,application/xhtml+xml,application/xml;q=0.9,

/

;q=0.8
说明: 相当于PHP中的服务器参数: $_SERVER["HTTP_ACCEPT"]

第二部分: server internals 部分参数

DOCUMENT_ROOT

样例参考值: C:/webRoot/t
说明: 相当于PHP中的服务器参数: $_SERVER["DOCUMENT_ROOT"]

SERVER_ADMIN

样例参考值: youemailaddress@gmail.com
说明: 相当于PHP中的服务器参数: $_SERVER["SERVER_ADMIN"]

SERVER_NAME

样例参考值: www.test.com
说明: 相当于PHP中的服务器参数: $_SERVER["SERVER_NAME"]

SERVER_ADDR

样例参考值: 127.0.0.1
说明: 相当于PHP中的服务器参数: $_SERVER["SERVER_ADDR"]

SERVER_PORT

样例参考值: 80
说明: 相当于PHP中的服务器参数: $_SERVER["SERVER_PORT"]

SERVER_PROTOCOL

样例参考值: HTTP/1.1
说明: 相当于PHP中的服务器参数: $_SERVER["SERVER_PROTOCOL"]

SERVER_SOFTWARE

样例参考值: Apache/2.2.11 (Win32) PHP/5.2.9-1
说明: 相当于PHP中的服务器参数: $_SERVER["SERVER_SOFTWARE"]

第三部分: connection & request 部分参数

REMOTE_ADDR

样例参考值: 127.0.0.1 正在浏览当前页面用户的 IP 地址。
说明: 相当于PHP中的服务器参数: $_SERVER["REMOTE_ADDR"]

REMOTE_HOST

样例参考值: 127.0.0.1 正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR
说明: 相当于PHP中的服务器参数: $_SERVER["REMOTE_HOST"]

REMOTE_PORT

样例参考值: 2574 (变化的值)用户连接到服务器时所使用的端口
说明: 相当于PHP中的服务器参数: $_SERVER["REMOTE_PORT"]

REMOTE_USER

样例参考值: 空
说明: PHP 好像未提供相关的$_SERVER值.

REMOTE_IDENT

样例参考值: 空
说明: PHP 好像未提供相关的$_SERVER值.

REQUEST_METHOD

样例参考值: GET
说明: 相当于PHP中的服务器参数: $_SERVER["REQUEST_METHOD"]

SCRIPT_FILENAME

样例参考值: C:/webRoot/t/share77.html
说明: 相当于PHP中的服务器参数: $_SERVER["SCRIPT_FILENAME"]

PATH_INFO

样例参考值: 空
说明: 相当于PHP中的服务器参数: $_REQUEST["PATH_INFO"]

QUERY_STRING

样例参考值: a=b&c=d&e=f
说明: 相当于PHP中的服务器参数: $_SERVER["QUERY_STRING"]

AUTH_TYPE

样例参考值: 空 当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个是认证的类型
说明: 相当于PHP中的服务器参数: $_SERVER["AUTH_TYPE"]

第四部分: date and time 部分参数

TIME_YEAR
样例参考值: 2009
说明: 服务器获取当前的年份值

TIME_MON
样例参考值: 04
说明: 服务器获取当前的月份值

TIME_DAY
样例参考值: 22
说明: 服务器获取当前的日值

TIME_HOUR
样例参考值: 16
说明: 服务器获取当前时间的小时

TIME_MIN
样例参考值: 26
说明: 服务器获取当前时间的分钟

TIME_SEC
样例参考值: 34
说明: 服务器获取当前时间的秒

TIME_WDAY
样例参考值: 3
说明: 服务器获取当天是星期几, 从星期日-星期六, 数字从 0-6

TIME
样例参考值: 20090422162634
说明: 服务器获取当前的时间, 格式为: 年月日时分秒

第四部分: specials 部分参数
API_VERSION
样例参考值: 20051115:21
说明: apache 的 API 版本信息.

THE_REQUEST
样例参考值: GET /share77.html HTTP/1.1
说明: 浏览器发给服务器的请求值. 不包括其他的头信息.

REQUEST_URI
样例参考值: /share77.html
说明: 浏览器请求的资源信息.

REQUEST_FILENAME
样例参考值: C:/webRoot/t/share77.html
说明: 被请求的资源的在磁盘的物理地址.

IS_SUBREQ
样例参考值: false
说明: 如果是 sub-request 则显示为 true, 否则为 false.

HTTPS
样例参考值: off
说明: 如果连接使用 SSL/TLS 模式, 则值为on , 否则值为off, 这个参数比较安全, 即使未载入 mod_ssl 模块时.

4、重写规则的指令

对于Rewrite来说共有九个指令:

RewriteBase, RewriteCond, RewriteEngine, RewriteLock, RewriteLog, RewriteLogLevel, RewriteMap, RewriteOptions, RewriteRule

通常最常用的是

RewriteEngine, RewriteBase, RewriteCond, RewriteRule

四个指令,下面简单介绍这四个指令。
[1]RewriteEngine: 就是是否使用 Rewrite 模式的开关, 使用就设置成 on, 否则设置成 off。
[2]RewriteBase:如果使用目录别名的话就需要设置这个指令,假设一个网站目录使用了别名操作: RewriteBase /ceshi /123/456 那么当客户端访问/ceshi/index.html 文件时是相当于访问 /123/456/index.html。
[3]RewriteCond:指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当自身的模板(pattern)匹配成功且这些条件也满足时规则才被应用于当前URL处理。注意,RewriteCond 指令后面可带 Flag, 现在只要2个可用, 一个是 NC(不区分大小写的意思), 一个是 OR(连接下一个条件)。这里对Rewritecond的正则匹配函数进行简单说明。
第一个: ! 表示否的意思. 比如一个条件: 判断访问此页面的上一页URL是否包含 sex 字符的话可以用这样: RewriteCond %{HTTP_REFERER} !(sex)
第二个: < 就是小于的意思, TestString < CondPattern.
第三个: > 就是大于于的意思, TestString < CondPattern.
第四个: = 相等的意思. <, >, = 三个和通常程序语言使用的 <, >, = 功能类似.
第五个: -d 是否是一个目录. 判断TestString是否不是一个目录可以这样: !-d
第六个: -f 是否是一个文件. 判断TestString是否不是一个文件可以这样: !-f
第七个: -s 是否是一个正常的有大小的文件. 判断TestString是否不是一个正常的有大小的文件可以这样: !-s
第八个: -l 是否是一个快捷方式文件. 判断TestString是否不是一个快捷方式文件可以这样: !-l
第九个: -x 是否是一个文件并且又执行权限. 判断TestString是否不是一个文件并且又执行权限可以这样: !-x
第十个: -F 检查TestString是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。
第十一个: -U 检查TestString是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。
[4]RewriteRule:是一个简单的命令告诉mod_rewrite这个模块如何去重写,关键的地方在于可以在模式和替换中使用正则表达式来匹配相应的字符,正则表达式的广泛的灵活性能将动态的URL转换成各式各样的符合要求的静态URL。
5、FLAG_参数
C|chain
C|chain 意思: 字符 'C' 或者 字符串 'chain' 表示出了该行重写规则外还要有其他的重写规则, 相当于通常程序语言的 与符号 '&' , 如果第一条规则条匹配的话进行下一项条件匹配. 如果第一条或者中间一条匹配不成功. 在其后的都会被跳过.

CO|cookie
CO|cookie 意思: 字符 'CO' 或者 字符串 'cookie' 表示当某些特殊的规则被匹配到的时候, 允许设置一个COOKIE, 设置参数包含3个必须字段和2个可选字段.
三个必须的字段是设定COOKIE的名字, 值, 还有这个COOKIE的所属域名, 另外两个可选的字段是COOKIE的生存时间和路径.默认的COOKIE生存时间是浏览器的会话时间. 默认的路径是 '/', 针对整个网站.
实际的使用例子想下面这样

RewriteEngine On
# RewriteRule 匹配模式 - [CO=COOKIE名称:COOKIE值:COOKIE域名:生存时间:路径] 各个参数用冒号:连接
RewriteRule ^/index.html - [CO=mycookie:myCookieValue:.test.com:1440:/]
#RewriteRule ^/index.html - [CO=mycookie:myCookieValue:.test.com] 或者省略后面的参数.

上面的规则的意思是在请求 index.html 文件的时候设置一个COOKIE值. COOKIE名是 mycookie, 值是:myCookieValue, 生效的域名是 .test.com, 生效时间是分钟计算的. 也就是生存时间是1天=24小时=1440分钟.

E|env
E|env 意思: 字符 'E' 或者 字符串 'env' 表示你可以设置一个环境变量. 注意一下变量在这个规则运行后生效.
看一个简单的例子, 就是apache在记录日志的时候不记录图片的读取记录. 那么下面的规则就有用了.
RewriteRule .(png|gif|jpg) - [E=image:1]
CustomLog logs/access_log combined env=!image

F|forbidden
F|forbidden 意思: 字符 'F' 或者 字符串 'forbidden' 表示禁止访问. Apache服务器会返回403禁止访问状态码给客户端.
下面的规则表示获取或者下载 exe程序文件是被显示禁止访问.
RewriteRule .exe - [F]

G|gone
G|gone 意思: 字符 'G' 或者 字符串 'gone' 表示服务器响应状态码为:410 通常使用该标志的时候 target 目标值设置成 "-" 被请求的资源是有效的.
下面的例子表示旧的资源是有效的. 并且不在乎大小写.
RewriteRule oldproduct - [G,NC]

H|handler
H|handler 意思: 字符 'H' 或者 字符串 'handler' 表示强制使用某类型处理程序处理被请求的资源. 比如请求一些不带后缀的文件的时候. 下面的列子表示当请求的URL里没有带'.'的时候, 强制使用PHP来处理这类的请求.
RewriteRule !. - [H=application/x-httpd-php]

L|last
L|last 意思: 字符 'L' 或者 字符串 'last' 表示当前规则是最后一条规则,停止分析以后规则的重写。该标志的使用频率非常高.
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*) index.php?req=$1 [L]
一定要注意的地方, 使用[L]标志的时候, 一定要注意你的匹配条件, 不会非常容易让你的重写规则陷入死循环, 比如你要定义页面所有页面请求都重写到一个 index.php 文件, 那么一定要注意在匹配条件时确定当请求的脚本不是index.php时才执行重写规则. 不然很明显当前页面请求的是 index.php, 当然 这个请求被重写到 index.php 然后index.php又被重写到index.php.. 这样反复执行. 页面会报错. 错误日志会记录报告你超出最大的重定向次数.

N|next
N|next 意思: 字符 'N' 或者 字符串 'next' 表示重新回到规则顶部重复执行. 一般在极端情况下用这个标志. 相当于一个while循环, 知道匹配失败时返回. 下面的例子表示把请求地址中的所有A字符替换成B字符.
RewriteRule (.

)A(.

) $1B$2 [N]

NC|nocase
NC|nocase 意思: 字符 'NC' 或者 字符串 'nocase' 表示请求的规则部分不区分大小写. 类似正则式里的/xxx/i 模式.
RewriteRule (.*.(jpg|gif|png))$ http://images.test.com$1 [P,NC]

NE|noescape
NE|noescape 意思: 字符 'NE' 或者 字符串 'noescape' 表示不对URL中的特殊字符进行 hexcode 转码.看下面的例子:
RewriteRule ^/share/(.+) /goShare.html#$1 [NE,R]
上面的例子表示所有请求 /share/xxx.xx的请求都会被定向到/goShare.html文件上. 并且后面的部分作为一个#后面的值. 如果不加NE标志的话, #将被转义成 %23 这样就造成 404 错误了.

NS|nosubreq
NS|nosubreq 意思: 字符 'NS' 或者 字符串 'nosubreq' 表示只用于不是内部子请求.比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求,它不一定有用的,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理,而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。

P|proxy
P|proxy 意思: 字符 'P' 或者 字符串 'proxy' 标志需要模块 mod_proxy 支持, 类似一个分发器网关的作用.比如网站的所有图片想用单独的一台服务器来运行. 那么先前的代码里的图片请求的时候, 直接定向到图片服务器去.
RewriteRule (.*).(jpg|gif|png) http://images.example.com$1.$2 [P]
使用[P]标志, 意味着使用了[L]标志, 因为使用该标志后马上就重定向到新地址了. 后面的重写规则会被忽略掉.

PT|passthrough
PT|passthrough 意思: 字符 'PT' 或者 字符串 'passthrough' 表示替换URL请问部分的地址.看例子
Alias /icons /usr/local/apache/icons
RewriteRule /pics/(.+).jpg /icons/$1.gif [PT]
当请求/pics/下的图片文件时, 实际是返回的是 /icons/目录下的同名文件. 需要注意的是一定要设置 [PT] 标志. 否则Alias设置无效.

QSA|qsappend
QSA|qsappend 意思: 字符 'QSA' 或者 字符串 'qsappend' 不怎么好表示. 看例子:
RewriteRule /pages/(.+) /page.php?page=$1 [QSA]
如果又标志: [QSA] 那么重写后的URL是: /page.php?page=123&one=two
如果没有[QSA]标志, 那么结果是: /page.php?page=123
此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。

R|redirect
R|redirect 意思: 字符 'R' 或者 字符串 'redirect' 表示进行重定向, 状态码在300-399里随机出, 默认是 302 重定向.通常和标志L一起使用. 使用模式: [R[=302]]

S|skip
T|type 意思: 字符 'S' 或者 字符串 'skip' 表示跳过执行下面的几个重写规则. 又点类似goto. 看下面的例子, 如果URL请求的文件不存在的话就跳过下面的两行重写规则.

# 请求的文件是否存在
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 不存在的情况
RewriteRule .? - [S=2]
RewriteRule (.*\.gif) images.php?$1
RewriteRule (.*\.html) docs.php?$1

T|type
T|type 意思: 字符 'T' 或者 字符串 'type' 表示为apache设置特定请求的响应类型. 也就是常说的 MIME type,比如一个perl脚本. 希望给客户端显示文本源码, 那么可以这样做:

RewriteRule \.pl$ - [T=text/plain]

或者你的服务器上的文件没有设置扩展名. 那么可以通知重写添加该文件的类型. 方便客户端显示.

RewriteRule IMG - [T=image/jpg]

6、简单的几个案例
例子1: 所有请求都定向到 index.php 脚本, 注意要排除 index.php 本身. 比如就进入死循环了.

RewriteRule !^index\.php$ index.php [L]

例子2: 当请求不存在的资源时, 统一定义到根目录下的 404.html

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /404.html [L]

例子3: 限制访问. 比如来自一些不友好的网站连接过来的请求. 不允许访问. 下例中如果 HTTP_REFERER 中包含 sex 字符, 则不允许访问.

RewriteCond %{HTTP_REFERER} sex
RewriteRule ^.*$ - [F]

例子4: 按照时间显示不同的页面, 比如访问 hello.html 页面时. 如果 在 8:00-19:00 的时候访问. 显示 hello.day.html 其他时间访问显示: hello.night.html

RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule ^hello\.html$ hello.day.html
RewriteRule ^hello\.html$ hello.night.html

例子5: 伪静态化, 比如访问 /user20.html 则调用viewUser.php 显示用户ID为20的用户资料

RewriteRule ^user([0-9]*)\.html$ viewUser.php?userid=$1

例子6: 喜欢用二级域名的比较实用了. 比如网站目录下有 user, upload 等几个目录, 可以通过 http://www.test.com/user 这样的模式访问. 但是如果想做成统一用二级域名模式访问: http://user.test.com , 但是不允许 http://www.test.com/user 这样访问. 那么就像下面这样来限制.

RewriteCond %{REQUEST_URI} ^/user
RewriteRule ^.*$ http://user.test.net" [L]

(说明:参考互联网多个资料,如需要深入研究,建议参考http://httpd.apache.org/docs/2.2/zh-cn/mod/mod_rewrite.html)

apache重定向去掉自动加上的query string

需求:
当网址是

http://xxx.xxx.xxx/a.php?b=c&d=356&e=fsdfsadfsdfdfsdf

跳转到

http://xxx.xxx.xxx/356.html

要取到之前网址中的356这个位置的参数,于是

RewriteEngine on
RewriteCond %{QUERY_STRING} ^b=c(.*)$
RewriteRule (.*) %{QUERY_STRING}
RewriteRule ^b=c&d=(.*)&(.*) http://xxx.xxx.com/$1.html [R=301,L]

但是实际操作之后跳转的网址变成了

http://xxx.xxx.xxx/356.html?b=c&d=356&e=fsdfsadfsdfdfsdf

apache自动加上了之前url里面的querystring参数,搜索了下,发现只要在最后加上一个问号,就ok了
参考http://www.dewen.io/q/5256/Apache+Rewrite%E5%BC%BA%E5%88%B6%E8%BD%AC%E5%8F%91+%E5%8E%BB%E9%99%A4+Query+String%E9%97%AE%E9%A2%98

RewriteEngine on
RewriteCond %{QUERY_STRING} ^b=c(.*)$
RewriteRule (.*) %{QUERY_STRING}
RewriteRule ^b=c&d=(.*)&(.*) http://xxx.xxx.com/$1.html? [R=301,L]