Apache rewrite 部分细节

多个.htaccess匹配的优先级

网站根路径下有一个.htaccess,根目录下的文件夹test中也有一个.htaccess,那么,访问http://localhost/test/xyz会有什么结果呢(test下不存在名为xyz的文件),或者说如果两个.htaccess都会对错误的访问进行处理,谁的优先级更高?

根路径下:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
RewriteRule ^.*$  https://baidu.com [R=301,L]

test路径下:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
RewriteRule ^.*$  https://bing.com [R=301,L]

测试结果是 test路径下的.htaccess起效了,也就是在浏览器上访问http://localhost/test/xyz实际上跳转到了Bing。当我把test下的.htaccess移除后则会跳转到Baidu.

罗列一些细节

  • $N 匹配的是RewriteRule 中正则匹配的内容(RewriteRule backreferences),而%N匹配的是RewriteCond中正则匹配的内容(RewriteCond backreferences),而\N则是正则表达式中原生的反向引用
  • 有时候出现的::并不是特殊的符号,只是方便使用的分隔符而已,喜欢的话可以用##等替代12
  • RewriteCond TestString CondPattern 中,TestString可以是以下内容构成的:
    • RewriteRule backreferences
    • RewriteCond backreferences
    • RewriteMap expansions 3
    • Server-Variables 4
  • RewriteRule Pattern Substitution [flags]中,pattern匹配的是什么?就我的理解来说,如果访问的链接是http://localhost:80/test/hello/hahahaha?x=100

    • 如果它由网站根目录下的.htaccess来处理,它匹配的内容就是test/hello/hahahaha;
    • 如果它由根目录/test/.htaccess来处理,它匹配的内容就是hello/hahahaha
      What is matched? 5
      In VirtualHost context, The Pattern will initially be matched against the part of the URL after the hostname and port, and before the query string (e.g. “/app1/index.html”).
      In Directory and htaccess context, the Pattern will initially be matched against the filesystem path, after removing the prefix that led the server to the current RewriteRule (e.g. “app1/index.html” or “index.html” depending on where the directives are defined).
      If you wish to match against the hostname, port, or query string, use a RewriteCond with the %{HTTP_HOST}, %{SERVER_PORT}, or %{QUERY_STRING} variables respectively.
      In any case, remember that regular expressions are substring matches. That is, you don’t need the regex to describe the entire string, just the part that you wish to match. Thus, using a regex of . is often sufficient rather than .*, and the regex abc is not the same as ^abc$.
  • 以后再补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值