我是 Apache 的新手mod_rewrite
,在让它做我想做的事情方面遇到了一些困难。
在我的静态目录中,我有一些 javascript 文件(.js
),它们有两种文件名:
xxxx.js
这是标准文件名AT_xxxx.js
(带前缀文件名)与之前的标准文件名重复,但也包含我的自定义内容
我想解析每个标准请求的 javascript 文件 ( xxxx.js
) 的请求,以检查是否存在自定义文件 ( AT_xxxx.js
)(包括所有子目录)。然后,在这种情况下,使用自定义文件而不是标准文件(可能通过内部重定向)。
我尝试了几个小时来解决这个问题,但仍然有问题。
笔记:另外,我不知道如何在子目录中找到自定义文件。
DocumentRoot "/data/apps/dev0/custom/my_static"
<filesMatch "\\.(js)$">
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/AT_$1.js -f
RewriteRule ^(.*[^/])/?$ %{DOCUMENT_ROOT}/AT_$1.js [QSA,L]
</filesMatch>
答案1
在您的 RewriteCond 中,您有一个反向引用 ($1)。但为了使用反向引用,您首先必须捕获一些内容并将其放入其中。尝试以下操作:
RewriteCond %{REQUEST_URI} ^/(.*).js$
RewriteCond %{DOCUMENT_ROOT}/AT_%1.js -f
RewriteRule ^(.*[^/])/?$ %{DOCUMENT_ROOT}/AT_$1.js [QSA,L]
上面发生的情况是,第一个条件检查请求的 URI 是否以 .js 结尾,如果是,则将文件名(最多 .js)存储在 RewriteCond 反向引用 %1 中。然后第二个条件检查文件名(尽管以 AT_ 开头)是否存在,如果存在,则重写为该文件名。
答案2
我找到了:
<filesMatch "\\.(js)$">
# Split into two variables, $1 is everything before the filename, $2 the filename without extension
RewriteCond %{REQUEST_FILENAME} ^(.+)/([^/]+)\.js$
# Add AT_ prefix and check if file exists
RewriteCond %1/AT_%2.js -f
# Internal Redirect with new file with AT_ prefix
RewriteRule ^(.+)/([^/]+)\.js$ %1/AT_%2.js [NC,L]
</filesMatch>