使用Apache的rewrite

做PHP项目中需要用到URL重定向技术,模拟好像是静态页面,能够隐藏URL真实地址,有助于雨鞋基本的安全防范等等。那么好像rewrite是个很好的解决办法。

Posted in Servers onMarch 09, 2021

做PHP项目中需要用到URL重定向技术,基本上的需求就是把比如 /user/heiyeluren 重定向到 /user.php?uid=heiyeluren 之类的URL上,当然,你也可以把 /article/200707291011.html重定向到 /article.php?id=200507291011 之类的,模拟好像是静态页面,能够隐藏URL真实地址,有助于雨鞋基本的安全防范等等。那么好像rewrite是个很好的解决办法。

要在Apache里运行rewrite的话,必须先安装mod_rewrite的组件,就是一个mod_rewrite.c文件,然后必须在./configure的时候要放上mod_rewrite就能安装。
一般配置rewrite的话,可以在httpd.conf里面配置,也能在网页当前目录的.htaccess文件里进行定义来决定重定向去那个文件,那样的话,就非常具有灵活性了,同样也能够适合虚拟主机用户来做。

我们看一个.htaccess文件的例子:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [S=42]

#RewriteRule ^share/$ /share.php [QSA,L]
RewriteRule ^tag/([^/]+)/?$ /user_tags.php?tag=$1 [QSA,L]
RewriteRule ^city/([^/]+)/?$ /user_city.php?tag=$1 [QSA,L]
#RewriteRule ^([^/]+)/day/([^/]+)/?$ /user_share.php?id=$1&s=1&selTime=$2 [QSA,L]
#RewriteRule ^([^/]+)/day/([^/]+)/?$ /user_share.php?id=$1&s=1&selTime=$2 [QSA,L]

RewriteRule ^([^/]+)/day/([^/]+)/?$ /user_share.php?id=$1&s=1&selTime=$2 [QSA,L]
RewriteRule ^([^/]+)/week/([^/]+)/?$ /user_share.php?id=$1&s=2&selTime=$2 [QSA,L]
RewRiteRule ^([^/]+)/month/([^/]+)/?$ /user_share.php?id=$1&s=3&selTime=$2 [QSA,L]

RewriteRule ^([^/]+)/day/?$ /user_share.php?id=$1&s=1    [QSA,L]
RewriteRule ^([^/]+)/week/?$ /user_share.php?id=$1&s=2   [QSA,L]
RewriteRule ^([^/]+)/month/?$ /user_share.php?id=$1&s=3  [QSA,L]

RewriteRule ^([^/]+)/?$ /user_share.php?id=$1    [QSA,L]
</IfModule>

比较长吧,我们就简单关注一下关键的内容。<IfModule></IfModule>之间就是定义的内容,RewriteEngine就是确定是否运行URL重写功能,RewriteBase就是基本的路径是什么,最关键的就是下面的RewriteRule,就是我们需要重写的规则了,这里应用了兼容Perl规则的正则表达式:

Text:
  .           匹配任意单个字符
  [chars]     匹配当前字符
  [^chars]    不匹配当前字符
  text1|text2 包含text1或者text2任何一个

 

Quantifiers:
  ?           零个或者一个?号前的字符
  *           零个或者任意个任意长度的任意字符
  +           一个或者任意个任意长度的字符

Grouping:
  (text)      Grouping of text
              (either to set the borders of an alternative or
              for making backreferences where the Nth group can
              be used on the RHS of a RewriteRule with $N)

Anchors:
  ^           匹配内容开始标记
  $           匹配内容结束标记

Escaping:
  \char       使用\来进行特殊字符的转义,包括".[]()"等字符的转义


基本规则如上,比如下面的正则表达式:^/([^/]+)/~([^/]+)/(.*)$ 就是能够匹配象 /Language/~ Realname/.../File 这样的路径。

那么从这个角度去看上面的内容就比较容易理解了。我们简单看一下RewriteRule指令的规则:
RewriteRule   访问的路径    需要指向的真实路径
这样就很清楚了,比如说我要把/user/myname重定向到/user.php?uid=myname那么我的规则就必须这样:

RewriteRule ^user/([^/]+)$  ^/user.php?uid=$2 [QSA,L]

举一反三,就很容易理解规则如何去写,也就能够理解上面规则脚本的内容了。


Tags in this post...

Servers 相关文章推荐
nginx对http请求处理的各个阶段详析
Mar 31 Servers
Mac环境Nginx配置和访问本地静态资源的实现
Mar 31 Servers
centos8安装nginx1.9.1的详细过程
Aug 02 Servers
nginx内存池源码解析
Nov 20 Servers
Nginx实现会话保持的两种方式
Mar 18 Servers
Shell脚本一键安装Nginx服务自定义Nginx版本
Mar 20 Servers
Tomcat用户管理的优化配置详解
Mar 31 Servers
Nginx禁止ip访问或非法域名访问
Apr 07 Servers
在Docker容器中部署SQL Server
Apr 11 Servers
windows server 2012安装FTP并配置被动模式指定开放端口
Jun 10 Servers
安装harbor作为docker镜像仓库的问题
Jun 14 Servers
Nginx报404错误的详细解决方法
Jul 23 Servers
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
Jun 21 #Servers
Nginx实现反向代理
Sep 20 #Servers
Centos7.7 64位利用本地完整安装包安装lnmp/lamp套件教程
nginx 设置多个站跨域
Mar 09 #Servers
Apache站点配置SSL强制跳转443
Mar 09 #Servers
Apache压力测试工具的安装使用
Nginx同一个域名配置多个项目的实现方法
Mar 31 #Servers
You might like
从php核心代码分析require和include的区别
2011/01/02 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
php实现的PDO异常处理操作分析
2018/12/27 PHP
Laravel框架实现的rbac权限管理操作示例
2019/01/16 PHP
JS 时间显示效果代码
2009/08/23 Javascript
什么是DOM(Document Object Model)文档对象模型
2012/03/05 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
JavaScript学习笔记之ES6数组方法
2016/03/25 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
python中的yield使用方法
2014/02/11 Python
在python中安装basemap的教程
2018/09/20 Python
对python中if语句的真假判断实例详解
2019/02/18 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
数控技术专业推荐信
2013/11/01 职场文书
通信研究生自荐信
2014/02/01 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
合作协议书模板
2014/10/10 职场文书
汽车转让协议书
2015/01/29 职场文书
教导主任个人总结
2015/03/03 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android
解析MySQL索引的作用
2022/03/03 MySQL
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js