设为首页 收藏本站
查看: 642|回复: 0

[经验分享] Apache Rewrite

[复制链接]

尚未签到

发表于 2016-12-29 09:02:49 | 显示全部楼层 |阅读模式
http://apache.chinahtml.com/rewrite/rewrite_guide.html
http://apps.hi.baidu.com/share/detail/19966800
http://www.okajax.com/a/201106/apache_rewrite.html

引用
现在我们了解一下 Apache Rewrite 的重写规则的具体指令吧.
重写规则具体有 RewriteBase, RewriteCond, RewriteEngine, RewriteLock, RewriteLog, RewriteLogLevel, RewriteMap, RewriteOptions, RewriteRule 九个指令. 通常最常用的是 RewriteEngine, RewriteBase, RewriteCond, RewriteRule 四个指令. 这个我们要重点讲解的. 如果这四个指令运用的比较熟练的话, 不是特别的网站. 基本上你想出什么样的URL 都可以满足你的需要了. 其他的指令就不在讲解了. 如果对前面说的4个指令比较熟悉的话. 剩下的去看看 apache 的手册. 相信掌握这些不会费你很多脑筋.
RewriteEngine 这个指令就不用说了. 就是是否使用 Rewrite 模式的开关, 使用就设置成 on, 否则设置成 off 作用域在: server config, virtual host, directory, .htaccess
我们这篇日志专门讲解: RewriteBase
RewriteBase 的作用域为: directory, .htaccess
通常默认的虚拟主机的网站在使用.htaccess 进行重写规则时不需要执行设置该指令. 因为 RewriteBase 默认值是该 .htaccess 文件所在的目录地址.
但是如果使用目录别名的话就需要设置这个指令了. 先看官方手册的例子. 假设一个网站目录使用了别名操作: Alias /xyz /abc/def 那么当客户端访问/xyz/xxx.html 文件时是相当于访问 /abc/def/xxx.html的. 然后看看在使用了别名的情况下重写效果. 当然这个 .htaccess 文件在 /abc/def/.htaccess 位置. 内容如下:
RewriteEngine On
RewriteBase /xyz
RewriteRule ^oldstuff\.html$ newstuff.html
假设访问服务器的: /xyz/oldstuff.html (比如: http://www.test.com/xyz/oldstuff.html 这样).
服务器处理流程大概是下面的样子.
第一步, 把alias别名还原成真实的路径:
/xyz/oldstuff.html -> /abc/def/oldstuff.html (per-server Alias)
第二步, rewrite前会去掉前缀(也就是.htaccess文件所在的目录部分这里是/abc/def/), 然后执行重写规则, 处理完之后再把前缀添加上去:
/abc/def/oldstuff.html -> /abc/def/newstuff.html (per-dir    RewriteRule)
第三步, 由于设定了RewriteBase值,所以路径最后还是被还原回去:
/abc/def/newstuff.html -> /xyz/newstuff.html      (per-dir    RewriteBase)
第四步, 重写规则完成, 别名再次使用. 最后得到的结果:
/xyz/newstuff.html     -> /abc/def/newstuff.html (per-server Alias)
实际上相当于请求: /abc/def/newstuff.html, 关于 alias 的用法和意思, 请另行参考 apache 手册.
这里要注意的是即使RewriteBase /xyz 这行被注释掉. 服务器还是会执行上面的 第一步, 第二步, 后面的不会被执行, 服务器执行完第二步以后就发出一个内部重定向. 按照上面的例子也就是 GET /abc/def/newstuff.html, 由于GET 模式获取到第一个是/开头的, 相当于请求DocumentRoot目录下的/abc/def/newstuff.html, 换成客户端请求的模式也就是 http://www.test.com/xyz/oldstuff.html 变成了 http://www.test.com/abc/def/newstuff.html 如果 /xyz 只是目录的别名, DocumentRoot 目录下根本没有实际的物理目录 abc/def 这样最终会导致一个 404 报错.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-320858-1-1.html 上篇帖子: apache缓存 下篇帖子: apache httpclient
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表