使用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配置https原理及实现过程详解
Mar 31 Servers
Nginx实现负载均衡的项目实践
Mar 18 Servers
Vertica集成Apache Hudi重磅使用指南
Mar 31 Servers
Kubernetes控制节点的部署
Apr 01 Servers
HDFS免重启挂载新磁盘
Apr 06 Servers
微信告警的zabbix监控系统 监控整个NGINX集群
Apr 18 Servers
Tomcat执行startup.bat出现闪退的原因及解决办法
Apr 20 Servers
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
May 25 Servers
linux目录管理方法介绍
Jun 01 Servers
ubuntu下常用apt命令介绍
Jun 05 Servers
windows server 2012安装FTP并配置被动模式指定开放端口
Jun 10 Servers
windows10 家庭版下FTP服务器搭建教程
Aug 05 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的安全
2006/10/09 PHP
php与paypal整合方法
2010/11/28 PHP
PHP中SimpleXML函数用法分析
2014/11/26 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
2015/12/04 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
2016/08/23 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
浅谈vue父子组件怎么传值
2018/07/21 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
vue 中几种传值方法(3种)
2019/11/12 Javascript
python使用nntp读取新闻组内容的方法
2015/05/08 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
python ssh 执行shell命令的示例
2020/09/29 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
建设投标担保书
2014/05/13 职场文书
作风大整顿心得体会
2014/09/10 职场文书
死亡证明书样本说明
2014/10/18 职场文书
南京南京观后感
2015/06/02 职场文书
法律意见书范文
2015/06/04 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python