Apache是否有仅存文件名的变量?能否合并批量RewriteRule规则?
Apache RewriteRule 规则精简与变量疑问
问题描述
我有大量如下的RewriteRule重定向规则:
RewriteRule ^demos/(bar-3d-effect-multi-row\.html) demos-website/$1 RewriteRule ^demos/(bar-adjustable\.html) demos-website/$1 RewriteRule ^demos/(bar-ajax\.html) demos-website/$1 RewriteRule ^demos/(bar-basic\.html) demos-website/$1 RewriteRule ^demos/(bar-dark-background\.html) demos-website/$1 RewriteRule ^demos/(bar-google-power-usage\.html) demos-website/$1 RewriteRule ^demos/(bar-i-love-my-dog-de-bordeaux\.html) demos-website/$1 RewriteRule ^demos.(bar-images-as-labels\.html) demos-website/$1 RewriteRule ^demos/(bar-interactive-key\.html) demos-website/$1 RewriteRule ^demos/(bar-line-switch-effect\.html) demos-website/$1 ...请问能否将这些重定向规则精简为几行?例如写成如下形式:
RewriteCond ^demos-website/%{FILENAME} -f RewriteRule ^demos/%{FILENAME} /demos-website/%{FILENAME}仅当demos-website目录中存在对应文件时才执行URL重写?另外,是否存在仅包含文件名(不含路径)的Apache变量?
规则精简方案
完全可以把这些重复规则精简成一行带条件的规则,不过需要修正你示例中的几个问题:
%{FILENAME}本身包含路径信息,直接拼接会导致文件检查路径错误- 原规则里有一条笔误(
demos.应该是demos/),精简规则可以自动兼容这类输入(只要目标文件存在)
正确的精简规则如下:
RewriteCond %{DOCUMENT_ROOT}/demos-website%{REQUEST_URI} -f RewriteCond %{DOCUMENT_ROOT}/demos-website%{REQUEST_URI} !-d RewriteRule ^demos/(.*\.html)$ /demos-website/$1 [L]
规则说明
RewriteCond %{DOCUMENT_ROOT}/demos-website%{REQUEST_URI} -f:检查网站根目录下的demos-website文件夹中,是否存在与请求URI对应的文件RewriteCond %{DOCUMENT_ROOT}/demos-website%{REQUEST_URI} !-d:额外排除请求是目录的情况,避免误匹配^demos/(.*\.html)$:匹配所有以demos/开头的HTML文件,将文件名部分捕获到$1[L]标记:表示这是最后一条规则,匹配后不再执行后续RewriteRule
Apache 文件名专用变量
Apache在2.4.19及以上版本中提供了%{basename}变量,这个变量仅包含请求的文件名(不含路径部分)。
如果你的Apache版本低于2.4.19,可以通过正则捕获的方式提取文件名,比如在RewriteRule中使用([^/]+)$来匹配URL最后一段的文件名:
# 提取文件名示例 RewriteRule ^demos/([^/]+)$ /demos-website/$1 [L]
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

