正则表达式匹配.htaccess中的一系列文件类型

C.O*_*.O. 5 php regex apache .htaccess

我想这将是一个愚蠢的问题,但我不知道这里发生了什么.我想通过.htaccess文件中的正则表达式匹配一组特定的URI.

我想要以下内容

  • 所有不包含的文件.
  • 所有以.htm/.html结尾的文件
  • 所有以.php结尾的文件

所以:

^[^.]+$
Run Code Online (Sandbox Code Playgroud)

用于匹配URI中没有点的所有文件.

\.html?$
Run Code Online (Sandbox Code Playgroud)

匹配所有.html/.htm文件

(^[^.]+$)|(\.html?$)
Run Code Online (Sandbox Code Playgroud)

似乎结合两者

(^[^.]+$)|(\.html?$)|(\.php$)
Run Code Online (Sandbox Code Playgroud)

无法将事物与以php结尾的匹配文件组合在一起.例如test.jpg匹配,而不应该匹配.

我一定错过了一些明显的东西.它是什么?谢谢.

更新:这是我使用的整个上下文:

### REWRITE RULES ###
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (^[^.]+$)|(\.html?$)|(\.php$) bootstrap.php [L,QSA]
Run Code Online (Sandbox Code Playgroud)

bootstrap.php包含:

echo "testing bootstrap";
Run Code Online (Sandbox Code Playgroud)

查询不存在的.jpg

http://localhost/test.jpg
Run Code Online (Sandbox Code Playgroud)

给我这个输出:

testing bootstrap
...
Run Code Online (Sandbox Code Playgroud)

更新2:

在测试下面的第一个答案后,我发现使用简单的:

RewriteRule \.php$ bootstrap.php [L,QSA]
Run Code Online (Sandbox Code Playgroud)

以与上述相同的方式失败.它匹配test.jpg.虽然服务器配置或.htaccess文件中没有什么疯狂的...这就是.htaccess文件中的全部内容,除了我已发布的内容:

AddType application/x-httpd-php .html
AddType application/x-httpd-php .xml
DirectoryIndex index.php
ErrorDocument 404 /errors/404.php
Run Code Online (Sandbox Code Playgroud)

答案:(无法再将我自己的问题再提出8个小时......)

谢谢大家帮助我.
特别感谢@mario,他通过下面的评论帮我解决了这个问题.
这确实是一个愚蠢的问题.以下是发生的事情:

rewrite.log:

strip per-dir prefix: D:/Web_Root/test.jpg -> test.jpg
applying pattern '\.php$' to uri 'test.jpg'
pass through D:/Web_Root/test.jpg
strip per-dir prefix: D:/Web_Root/errors/404.php -> errors/404.php
applying pattern '\.php$' to uri 'errors/404.php'
RewriteCond: input='D:/Web_Root/errors/404.php' pattern='!-d' => matched
rewrite 'errors/404.php' -> 'bootstrap.php'
...
Run Code Online (Sandbox Code Playgroud)

所以问题是我的404文档以*.php结束,这就是为什么*.jpg匹配未找到的文件.啊蝙蝠,我会搜索这个很长一段时间......

所以这样做:

RewriteRule ([^4]?[^0]?[^4]\.php) bootstrap.php [L,QSA]
Run Code Online (Sandbox Code Playgroud)

那么,完整的问题的答案是:

RewriteRule (^[^.]+$)|(\.html?$)|([^4]?[^0]?[^4]\.php) bootstrap.php [L,QSA]
Run Code Online (Sandbox Code Playgroud)

再次:谢谢大家.

mar*_*rio 1

[好吧,这不是这里的具体解决方案,但我将其作为一个虚假答案。]

当 mod_rewrite 规则出错时,有时启用RewriteLog. httpd.conf它需要在or部分进行配置VirtualHost,因此有点麻烦。但 Apache 会列出它执行的顺序和处理操作以及 URL。这有助于查看 Apache 是否理解正则表达式并且其行为是否正常。

请注意,如果实际的错误源是规则甚至部分,它有时可能保持AliasRedirectFileMatch。然而,在这种情况下,error.log甚至只是access.log可能包含一些提示。

如果全部失败,您可能会幸运地暂时启用Nanoweb而不是 Apache。它具有类似的mod_rewrite实现,但使用 PHP preg_matchPCRE 后端。(没有告诉我为什么知道这一点。