Apache mod_rewrite 重定向带前缀

Apache mod_rewrite 重定向带前缀

我是 Apache 的新手mod_rewrite,在让它做我想做的事情方面遇到了一些困难。

在我的静态目录中,我有一些 javascript 文件(.js),它们有两种文件名:

  1. xxxx.js这是标准文件名
  2. 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>

相关内容