我有一个重写规则,它大多有效。但我的问题是,我有很多文件中有一个以上的句点。我已经缩小了文件,我有如下的通用脚本文件:
jquery.dynamicform.js
bootstrap.min.js
我有一个重写规则,它利用了以下REGEX:
([^.]+.(jpeg|jpg|webp|webm|png|css|js))$
如果只有一个句点,那么这个正则表达式非常有效。以下是我的测试:
assets/css/styles.css
assets/css/bootstrap.min.css
assets/js/bootstrap.min.js
assets/js/scripts.js
assets/js/query.dynamicform.js
这在styles.css
和scripts.js
上给出了正确的结果,但在bootstrap.min.css
或bootstrap.min.js
或jquery.dynamicforms.js
上没有给出正确的结果。
关于如何让这个正则表达式适用于所有这些用例,有什么想法吗?
我的RewriteRule
特别被称为:
RewriteRule ([^.]+.(gif|jpeg|jpg|webp|webm|mp4|mp3|png|bmp|css|js|svg|bmp|woff|ttf))$ https://website.testing.dev/$1 [R=301,L,NC]
RewriteRule ([^.]+.(gif|jpeg|jpg|webp|webm|mp4|mp3|png|bmp|css|js|svg|bmp|woff|ttf))$ https://website.testing.dev/$1 [R=301,L,NC]
此正则表达式的问题是,给定对assets/css/bootstrap.min.css
的请求,它将只匹配(并捕获(min.css
,因为正则表达式[^.]+
不包括点。
因此,您基本上希望此规则适用于所有请求,这些请求仅以指定的文件扩展名之一结尾,并重定向到替代域上的相同URL路径。在这种情况下,您可以简单地匹配文件扩展名,并在替换字符串中使用REQUEST_URI
服务器变量。这样就避免了必须匹配整个URL路径。
例如(简化(:
RewriteRule .(gif|jpeg|jpg|css|js)$ https://website.testing.dev%{REQUEST_URI} [R=301,L,NC]
请注意,REQUEST_URI
服务器变量已经包含斜杠前缀,因此在替换字符串中省略了它。
或者,要匹配所有(尽管可以说效率较低(,您应该匹配.+
(所有(而不是[^.]+
(除了一个点之外的所有(,然后您可以在替换字符串中使用反向引用,就像您所做的那样。
例如:
RewriteRule (.+.(gif|jpeg|jpg|css|js))$ https://website.testing.dev/$1 [R=301,L,NC]