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

[经验分享] apache rewrite拟静态

[复制链接]

尚未签到

发表于 2017-1-3 09:38:33 | 显示全部楼层 |阅读模式
  mode-rewrite模块是apache中重要的模块,主要用来实现url跳转和重写,首先要启动该模块
  在http.conf文件下去掉该模块前的#号,即可启动了,
  他的配置规则是
  rewriteEngine on 启动引擎
  rewriteCond %{HTTP_HOST}!^www.ifensi.com[NC]正则匹配 ,nc表示不区分大小写
  rewriteRule 转换规则^/(.*)http://www.ifensi.com/[l]上面不匹配就跳转到此页面,主要用来防止盗链的,
  拟静态的配置
  RewriteEngine on
  RewriteRule ^/test([0-9]*).html/$ /test.php?id=$1表示你静态文字目录,可以是搜索引擎方便的发现更多页面信息,尤其是在新闻列表中,表示的意思是,当在浏览器地址栏中输入 testxx.html的时候,他会自动变为test.php?id=xx这样在浏览器中看,就像是文件是静态的,当然还有你目录与上面道理一样,
  规则修正符就是用来匹配规则的,F 禁用url就是你无法访问,  G返回401 就是在页面取消的时候,让搜索引擎只搜索一次,
  也可以看启用.htaccess 在document_dir 下 修改alloverred all则支持在文件中写规范,这是比较常用的,因为我们不可能总去修改服务器的东西,
  规范化url 

说明:

  在有些web服务器上,一个资源会拥有多个URL,在实际应用和发布中应该被使用的是规范的URL,其他的则是简写或者只在内部使用。无论用户在请求中使用什么形式的URL,他最终看见的都应该是规范的URL。


方案:

  对所有不规范的URL执行一个外部HTTP重定向,以改变它在浏览器地址栏中的显示及其后继请求。下例中的规则集用规范的/u/user替换/~user,并修正了/u/user所遗漏的后缀斜杠。

RewriteRule   ^/~([^/]+)/?(.*)    /u/$1/$2  [R]
RewriteRule   ^/([uge])/([^/]+)$  /$1/$2/   [R]
在有不同的doucumentroot的情况下可以使用
  RewriteEngine on
  RewriteRule   ^/$  /e/www/  [R]来重定向到不同的目录下,
后缀斜杠的问题


说明:

  每个网管对引用目录后缀斜杠的问题都有一本苦经,如果遗漏了,服务器会产生一个错误,因为如果请求是/~quux/foo而不是/~quux/foo/
,服务器就会去找一个叫foo的文件,而它是一个目录,所以就报错了。事实上,大多数情况下,它自己会试图修正这个错误,但是有时候需要你手工纠正,比如,在重写了许多CGI脚本中的复杂的URL以后。


方案:

  解决这个微妙问题的方案是让服务器自动添加后缀斜杠。对此,必须使用一个外部重定向,使浏览器正确地处理后继的对诸如图片的请求。如果仅仅作一个内部重写,可能只对目录页面有效,而对内嵌有使用相对URL的图片的页面无效,因为浏览器有请求内嵌目标的可能。比如,如果不用外部重定向,/~quux/foo/index.html页面中对image.gif的请求,其结果将是/~quux/image.gif
  所以,应该这样写:

RewriteEngine  on
RewriteBase    /~quux/
RewriteRule    ^foo$  foo/  [R]



  

虚拟用户主机

说明:

  如果需要为用户username支持一个www.username.host.domain.com的主页,但不是用在此机器上建虚拟主机的方法,而是用仅在此机器上增加一个DNS记录的方法实现。


方案:

  对HTTP/1.0的请求,这是无法实现的;但是对HTTP/1.1的在HTTP头中包含有主机名的请求,可以用以下规则集来内部地重写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

负载的均衡


说明:

  如何均衡www.foo.com的负载到www[0-5].foo.com(一共是6个服务器)?


方案:

  这个问题有许多可能的解决方案,在此,我们讨论通称为“基于DNS”的方案,和特殊的使用mod_rewrite的方案:



  • DNS循环(DNS Round-Robin)  最简单的方法是用BIND的DNS循环特性,只要按惯例设置www[0-9].foo.com的DNS的A(地址)记录,如:

    www0   IN  A       1.2.3.1
    www1   IN  A       1.2.3.2
    www2   IN  A       1.2.3.3
    www3   IN  A       1.2.3.4
    www4   IN  A       1.2.3.5
    www5   IN  A       1.2.3.6


      然后,增加以下各项:

    www    IN  CNAME   www0.foo.com.
    IN  CNAME   www1.foo.com.
    IN  CNAME   www2.foo.com.
    IN  CNAME   www3.foo.com.
    IN  CNAME   www4.foo.com.
    IN  CNAME   www5.foo.com.
    IN  CNAME   www6.foo.com.


      注意,上述看起来似乎是错误的,但事实上,它的确是BIND中的一个预期的特性,而且也可以这样用。无论如何,现在www.foo.com已经被解析,BIND可以给出www0-www6
    ,虽然每次在次序上会有轻微的置换/循环,客户端的请求可以被分散到各个服务器。但这并不是一个优秀的负载均衡方案,因为DNS解析信息可以被网络中其他名称服务器缓冲,而一旦www.foo.com被解析为wwwN.foo.com,则其后继请求都将被送往www.foo.com。但是最终结果是正确的,因为请求的总量的确被分散到各个服务器了


  • DNS 负载均衡  一种成熟的基于DNS的负载均衡方法是使用http://www.stanford.edu/~schemers/docs/lbnamed/lbnamed.html的lbnamed程序,它是一个Perl5程序,带有若干辅助工具,实现了真正的基于DNS的负载均衡。


  • 代理吞吐循环(Proxy Throughput Round-Robin)  这是一个使用mod_rewrite及其代理吞吐特性的方法。首先,在DNS记录中将www0.foo.com固定为www.foo.com
    ,如下:

    www    IN  CNAME   www0.foo.com.


      其次,将www0.foo.com转换为一个专职代理服务器,即由这个机器把所有到来的URL通过内部代理分散到另外5个服务器(www1-www5)。为此,必须建立一个规则集,对所有URL调用一个负载均衡脚本lb.pl


    RewriteEngine on
    RewriteMap    lb      prg:/path/to/lb.pl
    RewriteRule   ^/(.+)$ ${lb:$1}           [P,L]


      以下是lb.pl :

    #!/path/to/perl
    ##
    ##  lb.pl -- load balancing script
    ##
    $| = 1;
    $name   = "www";     # the hostname base
    $first  = 1;         # the first server (not 0 here, because 0 is myself)
    $last   = 5;         # the last server in the round-robin
    $domain = "foo.dom"; # the domainname
    $cnt = 0;
    while (<STDIN>) {
    $cnt = (($cnt+1) % ($last+1-$first));
    $server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);
    print "http://$server/$_";
    }
    ##EOF##



    最后的说明:这样有用吗?www0.foo.com似乎也会超载呀?答案是:没错,它的确会超载,但是它超载的仅仅是简单的代理吞吐请求!所有诸如SSI、CGI、ePerl等等的处理完全是由其他机器完成的,这个才是要点。

  • 硬件/TCP循环  还有一个硬件解决方案。Cisco有一个叫LocalDirector的东西,实现了TCP/IP层的负载均衡,事实上,它是一个位于网站集群前端的电路级网关。如果你有足够资金而且的确需要高性能的解决方案,那么可以用这个。


运维网声明 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-323103-1-1.html 上篇帖子: Apache MINA框架简述 下篇帖子: Apache Lucene
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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