使用htaccess进行自动版本控制:htaccess regex重写规则没有拾取模式

Don*_*ins 8 php regex versioning .htaccess mod-rewrite

使用中的答案,建议这个问题,以及本文它提供了一个几乎相同的解决方案,我一直在试图建立的htaccess来处理我的js和css文件自动版本化的规则.

我想这样做的原因是,我改变他们了不少,但还是希望他们能够通过积极长时间浏览器缓存,而不必每次都改变时手动输入一个新的版本号.

使用的方法很简单:(1)一个函数在模式上使用它们被更改的日期将文件编号附加到文件[filename].[version_number].[suffix],因此style.css,例如,将变为style.1300638388.css; (2)使用php,版本号包含在我网站页面的样式表声明中,如果版本化文件名与缓存文件名不同,则会向客户端浏览器提供新副本; (3)使用mod_rewrite的.htaccess中的RewriteRule重写版本号,将其恢复为原始值并提供更新后的文件.

下面列出了我在这三个阶段中使用的代码.我在http://edge.donaldjenkins.net/上我博客的沙盒版本的样式表上测试了这个

1.在WordPress的functions.php文件中

// Allows autoversioning of css and js files

/**
 *  Given a file, i.e. /css/base.css, replaces it with a string containing the
 *  file's mtime, i.e. /css/base.1221534296.css.
 *  
 *  @param $file  The file to be loaded.  Must be an absolute path (i.e.
 *                starting with slash).
 */
function auto_version($file)
{
  if(strpos($file, '/') !== 0 || !file_exists($_SERVER['DOCUMENT_ROOT'] . $file))
    return $file;

  $mtime = filemtime($_SERVER['DOCUMENT_ROOT'] . $file);
  return preg_replace('{\\.([^./]+)$}', ".$mtime.\$1", $file);
}
Run Code Online (Sandbox Code Playgroud)

2.在<head>我的博客文件部分

<!-- Stylesheets  -->
<link rel="stylesheet" href="<?=auto_version('/path/to/style.css')?>" />
Run Code Online (Sandbox Code Playgroud)

3.在.htaccess文件中

# Allow versioning for js and css files

RewriteEngine On
RewriteRule ^(.*)\.[\d]+\.(css|js)$ $1.$2 [L] # Strip out the version number

# End Allow versioning for js and css files
Run Code Online (Sandbox Code Playgroud)

利用上述设置,网页上显示没有任何格式,并且将所生成的网页的源代码示出了样式表作为参考的版本数这当然不存在于服务器上.

这表明该函数正确地更改了样式表的名称,但由于某种原因,.htaccess中的RewriteRule中的正则表达式模式没有捕获文件名并重写它.事实上,如果我改变它,它甚至都没有抓住它^style.1300638388.css$ style.css [L].

我已经尝试了几种模式,但没有用,但必须遗漏一些非常基本的东西.

mod_rewrite 在服务器上打开并运行其他几个RewriteRule实例没有问题.

UPDATE

.htaccess文件中唯一的其他RewriteRule 是标准的WordPress漂亮网址重写规则.我怀疑它会干扰这个,虽然很明显我不能轻易测试没有WordPress规则,因为这将完全打破页面生成:

# BEGIN WordPress

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
Run Code Online (Sandbox Code Playgroud)

更新2:已解决

CharlesLeaf在下面的评论中指出,由于WordPress规则是在版本控制之前,后者不会被执行.这实际上是原因,并允许我通过将这两个规则分组来回答问题,如下所示:

<IfModule mod_rewrite.c>

# Allow versioning for js and css files

RewriteEngine On
RewriteRule ^(.*)\.[\d]+\.(css|js)$ $1.$2 [L] # Strip out the version number

# End Allow versioning for js and css files

# BEGIN WordPress

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php

# END WordPress

</IfModule>
Run Code Online (Sandbox Code Playgroud)

Cha*_*eaf 3

^ 表示“字符串的开头”,在本例中不是“style”,而是 /path/to/style。

您可以尝试使用正则表达式中的完整路径,或者查看 RewriteBase。

更新的解决方案 这种情况下的问题是,在有问题的 RewriteRule 之前还有其他 RewriteRule,因此它从未达到此 RewriteRule。RewriteRules 的正确顺序很重要。