Apache rewrite 部分细节

来源:互联网 发布:释放内存软件 编辑:程序博客网 时间:2024/06/15 22:08

多个.htaccess匹配的优先级

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

根路径下:

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

test路径下:

RewriteEngine OnRewriteCond %{REQUEST_FILENAME} -s [OR]RewriteCond %{REQUEST_FILENAME} -l [OR]RewriteCond %{REQUEST_FILENAME} -dRewriteRule ^.*$ - [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$.
  • 以后再补充


  1. What Double Colon does in RewriteCond? ↩
  2. What does ::$1 mean in an htaccess? ↩
  3. http://httpd.apache.org/docs/current/rewrite/rewritemap.html ↩
  4. http://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteCond ↩
  5. http://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteRule ↩
0 0