面对.htaccess忽略了.htaccess中的标志L,RewriteRule导致两条规则发生冲突。我懒得弄清楚是怎么回事,我决定简单地更改第一条规则的正则表达式,使其永远不会与第二条规则相交。实际上,规则是:
Если запрашиваем /<имя файла>.js, то отдать файл /public/scripts/<имя файла>.js
Если запрашиваем /lib/<имя файла>.js, то отдать файл /libs/js/<имя файла>.js
因此,如果第一条规则不处理以 开头的请求/lib/,那么问题就会自行消失。例如,像这样:
RewriteRule ^(?<!lib\/)((.*)(\.js))$ public/scripts/$1 [L]
RewriteRule ^lib\/(.*)(\.js)$ libs/js/$1$2 [L]
过去的。Apache 一般不知道这样的设计,更不用说在最意想不到的地方不断出现 500 错误了。但是下面的规则是有效的(偶然发现的,多亏了错别字):
RewriteRule ^lib\/(.*)(\.js)$ libs/js/$1$2 [L]
RewriteRule ^(lib)?([^\/]*\.js)$ public/scripts/$2 [L]
从我所知道的正则表达式的角度来看,第二条规则开头的构造读作“字符串的开头可能包含一个子字符串lib”,但 Apache 显然以某种不同的方式理解它,因为在这种形式中第二条规则不再与第一条冲突。我试着交换它们,认为也许标志只是起作用L了,但这些规则的顺序并不影响它们的行为。
结合以上内容,我有一个问题:Apache 使用什么样的正则表达式语法(版本 2.4.7,如果是)?我在哪里可以找到关于它的完整文档?
如果我理解正确的话
对 js 文件的请求转到根目录或 lib 文件夹,然后执行此操作