Php 使用htaccess进行自动版本控制:htaccess正则表达式重写规则不拾取模式

Php 使用htaccess进行自动版本控制:htaccess正则表达式重写规则不拾取模式,php,regex,.htaccess,mod-rewrite,versioning,Php,Regex,.htaccess,Mod Rewrite,Versioning,我一直在尝试设置htaccess,以便在我的js和css文件上处理自动版本控制规则 我之所以想这样做,是因为我对它们做了很多更改,但仍然希望浏览器能够对它们进行长时间的缓存,而不必在每次更改时手动输入新的版本号 使用的方法很简单:(1)函数使用文件更改的日期在模式[filename].[version\u number].[suffix]上向文件追加一个版本号,例如style.css,将变成style.130063888.css;(2) 使用php,版本号包含在我的站点页面的样式表声明中,并提供

我一直在尝试设置htaccess,以便在我的js和css文件上处理自动版本控制规则

我之所以想这样做,是因为我对它们做了很多更改,但仍然希望浏览器能够对它们进行长时间的缓存,而不必在每次更改时手动输入新的版本号

使用的方法很简单:(1)函数使用文件更改的日期在模式
[filename].[version\u number].[suffix]
上向文件追加一个版本号,例如
style.css
,将变成
style.130063888.css
;(2) 使用php,版本号包含在我的站点页面的样式表声明中,并提供给客户端浏览器,如果版本文件名与缓存的文件名不同,客户端浏览器将请求新副本;(3) .htaccess中使用mod_rewrite的RewriteRule重写版本号,将其还原为原始值,并为更新后的文件提供服务

下面列出了我在这三个阶段中使用的代码。我正在我的博客的沙盒版本的样式表上测试这个

1.在WordPress的functions.php文件中 2.在我博客文件的
部分 使用上面描述的设置,页面显示时没有任何格式,生成页面的源代码显示样式表被引用为版本号,当然服务器上不存在该版本号

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

我尝试了几种模式,但都没有成功,但肯定缺少了一些非常基本的东西

mod_rewrite
在服务器上处于启用状态,并且对其他几个RewriteRule实例运行时不会出现问题

更新

.htaccess
文件中唯一的其他重写规则是标准的WordPress pretty url重写规则。我怀疑它会干扰这一点,尽管显然没有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
#开始WordPress
重新启动发动机
重写基/
重写规则^index\.php$-[L]
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写规则/index.php[L]
#结束WordPress
更新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>

#允许js和css文件的版本控制
重新启动发动机
重写规则^(.*)\.[\d]+\.(css|js)$$1.$2[L]#去掉版本号
#结束允许js和css文件的版本控制
#开始WordPress
重写基/
重写规则^index\.php$-[L]
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写规则/index.php
#结束WordPress

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

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

更新的解决方案
这个场景中的问题是,在所讨论的重写规则之前还有其他重写规则,所以它从未达到这个重写规则。重写规则的正确顺序很重要。

感谢您提供.htaccess解决方案。我在jQuery插件文件中遇到了一些问题,这些文件在文件名中包含自己的版本控制方案,如jQuery.name-OF-plugin.1.1.js。我建议使用
[0-9]{10}
解析文件修改时间,这样只会“删除”一个十位数的后缀。如果文件名末尾有十位数,仍然可能出现错误,但这是一种罕见的边缘情况

# Allow versioning for js and css files

RewriteRule ^(.*)\.[0-9]{10}\.(css|js)$ $1.$2 [L] # Strip out the version number

# End Allow versioning for js and css files

此外,UNIX Epoch时间戳中的11位数字在周六,2286年11月20日17:46:40 GMT之前不需要计算。

@Charles:谢谢您的建议!实际上,我已经尝试过了,但是将正则表达式模式设置为
^/path\/到\/(.*).[\d]+\(css|js)$$1.$2[L]
不幸地产生了相同的结果:版本号被返回,因此被服务器忽略。如果以
^path
开始,会怎么样?(因为第一个斜杠可能不包括在内)@Charles:不幸的是,
^path\/到\/(.*).[\d]+\(css|js)$$1.$2[L]
会产生同样的结果:(我想你也应该在重写URL中添加
/path/to
,但我不确定这是否足够。然而,由于我没有发现任何其他错误-我唯一能想象的是其他重写规则正在干扰,甚至阻止了这条规则的处理。也许吧?@Charles:我也尝试过,但没有,它没有没有任何区别。htaccess文件只包含另一条重写规则,这是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
<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>
# Allow versioning for js and css files

RewriteRule ^(.*)\.[0-9]{10}\.(css|js)$ $1.$2 [L] # Strip out the version number

# End Allow versioning for js and css files