您的位置:首页 > 运维架构 > Apache

apache重写模块学习(2)自己的一些记录

2015-01-17 10:24 246 查看
看了下mod_rewrite在各项参数的意义,但是感觉不是很懂,就想通过一些实际的案例来理解具体的细节

下面的一些操作都是在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'的内容,这时RewriteRule的^(.*)是从url的哪一部分选取的呢?一直很纠结这个

来测一测

在网站的根目录下的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: