当前位置:首页 > PHP教程 > Apach > 列表

mod_rewrite小技巧

发布:smiling 来源: PHP粉丝网  添加日期:2013-11-23 17:46:39 浏览: 评论:0 

7.将.html后缀名转换成.php

前提是.html文件能继续访问的情况下,更新你的网站链接。

rewriterule ^/?([a-z/]+).html$ $1.php [l]

这不是一个网页重定向,所以访问者是不可见的。让他作为一个永久重定向(可见的),将flag修改[r=301,l]。

8.创建无文件后缀名链接

如果你想使你的php网站的链接更加简洁易记-或者隐藏文件的后缀名,试试这个:

rewriterule ^/?([a-z]+)$ $1.php [l]

如果网站混有php以及html文件,你可以用rewritecond先判断该后缀的文件是否存在,然后进行替换:

rewritecond %{request_filename}.php -f

rewriterule ^/?([a-za-z0-9]+)$ $1.php [l]

rewritecond %{request_filename}.html -f

rewriterule ^/?([a-za-z0-9]+)$ $1.html [l]

如果文件是以.php为后缀,这条规则将被执行。

9.检查查询变量里的特定参数

如果在url里面有一个特殊的参数,你可用rewritecond鉴别其是否存在:

rewritecond %{query_string} !uniquekey=

rewriterule ^/?script_that_requires_uniquekey.php$ other_script.php [qsa,l]

以上规则将检查{query_string}里面的uniquekey参数是否存在,如果{request_uri}值为script_that_requires_uniquekey,将会定向到新的url。

10.删除查询变量

apache的mod_rewrite模块会自动辨识查询变量,除非你做了以下改动:

a).分配一个新的查询参数(你可以用[qsa,l]flag保存最初的查询变量)

b).在文件名后面加一个“?”(比如index.php?)。符号“?”不会在浏览器的地址栏里显示。

11.用新的格式展示当前uri 

如果这就是我们当前正在运行的urls:/index.php?id=nnnn。我们非常希望将其更改成/nnnn并且让搜索引擎以新格式展现。首先,我们为了让搜索引擎更新成新的,得将旧的urls重定向到新的格式,但是,我们还得保证以前的index.php照样能够运行。是不是被我搞迷糊了?

实现以上功能,诀窍就在于在查询变量中加了一个访问者看不到的标记符“marker”。我们只将查询变量中没有出现“marker”标记的链接进行重定向,然后将原有的链接替换成新的格式,并且通过[qsa]flag在已有的参数加一个“marker”标记。以下为实现的方式:

rewritecond %{query_string} !marker

rewritecond %{query_string} id=([-a-za-z0-9_+]+)

rewriterule ^/?index.php$ %1? [r=301,l]

rewriterule ^/?([-a-za-z0-9_+]+)$ index.php?marker &id=$1 [l]

这里,原先的url:http://www.example.com/index.php?id=nnnn,不包含marker,所以被第一个规则永久重定向到http://www.example.com/nnnn,第二个规则将http://www.example.com/nnnn反定向到http://www.example.com/index.php?marker &id=nnnn,并且加了marker以及id=nnnn两个变量,最后mod_rewrite就开始进行处理过程。

第二次匹配,marker被匹配,所以忽略第一条规则,这里有一个“.”字符会出现在http://www.example.com/index.php?marker &id=nnnn中,所以第二条规则也会被忽略,这样我们就完成了。

注意,这个解决方案要求apache的一些扩展功能,所以如果你的网站放于在共享主机中会遇到很多障碍。

12.保证安全服务启用

apache可以用两种方法辨别你是否开启了安全服务,分别引用{https教程}和{server_port}变量:

rewritecond %{request_uri} ^secure_page.php$

rewritecond %{https} !on

rewriterule ^/?(secure_page.php)$ https://www.example.com/$1 [r=301,l]

以上规则测试{request_uri}值是否等于我们的安全页代码,并且{https}不等于on。如果这两个条件同时满足,请求将被重定向到安全服务uri.另外你可用{server_port}做同样的测试,443是常用的安全服务端口

rewritecond %{request_uri} ^secure_page.php$

rewritecond %{server_port} !^443$

rewriterule ^/?(secure_page.php)$ https://www.example.com/$1 [r=301,l]

13.在特定的页面上强制执行安全服务 

遇到同一个服务器根目录下分别有一个安全服务域名和一个非安全服务域名,所以你就需要用rewritecond 判断安全服务端口是否占用,并且只将以下列表的页面要求为安全服务:

rewritecond %{server_port} !^443$

rewriterule ^/?(page1|page2|page3|page4|page5)$ https://www.example.com/%1 [r=301,l]

以下是怎样将没有设置成安全服务的页面返回到80端口:

rewritecond %{ server_port } ^443$

rewriterule !^/?(page6|page7|page8|page9)$ http://www.example.com%{request_uri} [r=301,l]

Tags: modrewrite 小技巧

分享到: