• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 使用mod_rewrite的高级技术

    它使用mod_rewrite提供了一些高级技术。

    请注意,这些示例中的许多示例在您的特定服务器配置中都不会起作用,因此,理解它们,而不只是将示例剪切并粘贴到您的配置中,这一点很重要。

    跨多个后端的基于URL的分片

    描述:

    分配服务器负载或存储空间负担的常用技术称为“分片”。使用此方法时,前端服务器将使用url一致地“分片”用户或对象以分离后端服务器。

    解:

    在外部映射文件中维护着从用户到目标服务器的映射。他们看起来像:

    user1 physical_host_of_user1
    user2 physical_host_of_user2
    : :
    

    我们将其放入map.users-to-hosts文件中。目的是绘制地图;

    /u/user1/anypath
    

    http://physical_host_of_user1/u/user/anypath
    

    因此,每个URL路径不必在每个后端物理主机上都有效。以下规则集借助地图文件为我们完成此操作,假设server0是默认服务器,如果用户在地图中没有任何条目,将使用该默认服务器:

    RewriteEngine on
    RewriteMap    users-to-hosts      "txt:/path/to/map.users-to-hosts"
    RewriteRule   "^/u/([^/]+)/?(.*)" "http://${users-to-hosts:$1|server0}/u/$1/$2"
    

    有关RewriteMap此指令的语法的更多讨论,请参见文档。

    即时内容再生

    描述:

    我们希望动态生成内容,但是一旦生成内容就将其静态存储。此规则将检查静态文件是否存在,如果不存在,请生成该文件。如果需要,可以定期删除静态文件(例如,通过cron),并将按需重新生成。

    解:
    这是通过以下规则集完成的:
    # This example is valid in per-directory context only
    RewriteCond "%{REQUEST_URI}"   "!-U"
    RewriteRule "^(.+)\.html$"     "/regenerate_page.cgi"   [PT,L]
    

    -U操作员确定的测试字符串是否(在这种情况下,REQUEST_URI)是一个有效的URL。它通过子请求来完成。如果此子请求失败-也就是说,所请求的资源不存在-该规则将调用CGI程序/regenerate_page.cgi,该程序将生成所请求的资源并将其保存到文档目录中,以便在下次请求该资源时副本可以送达。

    这样,可以以静态形式提供不经常更新的文档。如果需要刷新文档,可以将它们从文档目录中删除,然后在下次请求时重新生成它们。

    负载均衡

    描述:

    我们希望使用mod_rewrite在多个服务器之间随机分配负载。

    解:

    我们将使用RewriteMap和服务器列表来完成此任务。

    RewriteEngine on
    RewriteMap lb        "rnd:/path/to/serverlist.txt"
    RewriteRule "^/(.*)" "http://${lb:servers}/$1"     [P,L]
    

    serverlist.txt将包含服务器列表:

    ## serverlist.txt
    
    servers one.example.com|two.example.com|three.example.co
    

    如果您希望一台特定的服务器比其他服务器获得更多的负载,请将其添加到列表中的次数更多。

    讨论区

    Apache带有一个负载平衡模块--mod_proxy_balancer它比使用mod_rewrite可以拼凑的任何东西都更加灵活和功能丰富。

    结构化用户目录

    描述:

    一些具有数千个用户的站点使用结构化的homedir布局,每个homedir位于子目录中,该子目录(例如)以用户名的第一个字符开头。因此,/~larry/anypath是 while 是。/home/l/larry/public_html/anypath/~waldo/anypath/home/w/waldo/public_html/anypath

    解:

    我们使用以下规则集将波浪号URL扩展为上述布局。

    RewriteEngine on
    RewriteRule   "^/~(([a-z])[a-z0-9]+)(.*)"  "/home/$2/$1/public_html$3"
    

    重定向锚点

    描述:

    默认情况下,重定向到HTML锚不起作用,因为mod_rewrite会对#字符进行转义,将其转换为%23。反过来,这破坏了重定向。

    解:

    使用上的[NE]标志RewriteRule。NE代表不逃脱。

    讨论:
    当然,该技术还可以与默认情况下使用mod_rewrite URL编码的其他特殊字符一起使用。

    时间相关的重写

    描述:

    我们希望使用mod_rewrite根据一天中的时间提供不同的内容。

    解:

    有很多TIME_xxx为重写条件命名的变量。在与特殊字典比较模式相结合<STRING>STRING=STRING我们所能做的与时间相关的重定向:

    RewriteEngine on
    RewriteCond   "%{TIME_HOUR}%{TIME_MIN}" ">0700"
    RewriteCond   "%{TIME_HOUR}%{TIME_MIN}" "<1900"
    RewriteRule   "^foo\.html$"             "foo.day" [L]
    RewriteRule   "^foo\.html$"             "foo.night"
    

    这提供的内容foo.day.html的URL下foo.html07:01-18:59,并在剩余时间的内容foo.night.html

    mod_cache,中间代理和浏览器可能各自缓存响应,并使任一页面显示在配置的时间窗口之外。mod_expires可以用来控制这种效果。当然,您只需要动态地提供内容并根据一天中的时间对其进行自定义,就会更好。

    根据URL部分设置环境变量

    描述:

    有时,我们希望在执行重写时保持某种状态。例如,您要记下已完成重写的记录,以便以后可以查看是否通过该重写请求。一种方法是设置环境变量。

    解:

    使用[E]标志设置环境变量。

    RewriteEngine on
    RewriteRule   "^/horse/(.*)"   "/pony/$1" [E=rewritten:1]
    

    稍后在规则集中,您可以使用RewriteCond检查此环境变量:

    RewriteCond "%{ENV:rewritten}" "=1"
    

    请注意,环境变量不能在外部重定向中生存。您可以考虑使用[CO]标志来设置Cookie。对于按目录重写和htaccess重写,其中最终替换被作为内部重定向处理,来自上一轮重写的环境变量以“ REDIRECT_”为前缀。