Php regex以匹配.htaccess中的一系列文件类型

Php regex以匹配.htaccess中的一系列文件类型,php,regex,apache,.htaccess,Php,Regex,Apache,.htaccess,我想这将是一个愚蠢的问题,但我不明白这里发生了什么。我想通过.htaccess文件中的正则表达式匹配特定的URI集 我想要以下 不包含的所有文件 以.htm/.html结尾的所有文件 所有以.php结尾的文件 因此: 用于匹配URI中没有点的所有文件 \.html?$ 匹配所有.html/.htm文件 (^[^.]+$)|(\.html?$) 似乎两者都能起作用 (^[^.]+$)|(\.html?$)|(\.php$) 无法将内容与以php案例结尾的匹配文件组合。例如,test.jp

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

我想要以下

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

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

\.html?$
匹配所有.html/.htm文件

(^[^.]+$)|(\.html?$)
似乎两者都能起作用

(^[^.]+$)|(\.html?$)|(\.php$)
无法将内容与以php案例结尾的匹配文件组合。例如,test.jpg现在匹配,但不应该匹配

我一定错过了什么明显的东西。 这是怎么一回事?谢谢

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

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

echo "testing bootstrap";
查询不存在的.jpg

http://localhost/test.jpg
给我这个输出:

testing bootstrap
...
更新2:

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

RewriteRule \.php$ bootstrap.php [L,QSA]
以与上述相同的方式失败。它与test.jpg匹配。不过,服务器配置或.htaccess文件中没有什么疯狂之处。。。这就是.htaccess文件中的所有内容,除了我已经发布的内容:

AddType application/x-httpd-php .html
AddType application/x-httpd-php .xml
DirectoryIndex index.php
ErrorDocument 404 /errors/404.php
回答:(在8个小时内无法回答我自己的问题…)

谢谢大家帮助我。
特别感谢@mario,他在下面的评论中帮助我解决了这个问题。
这的确是个愚蠢的问题。下面是发生的情况:

重写.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'
...
所以问题是我的404文档以*.php结尾,这就是为什么*.jpg与未找到的文件匹配。啊,蝙蝠们,我会找这个很久的

这就是:

RewriteRule ([^4]?[^0]?[^4]\.php) bootstrap.php [L,QSA]
那么,完整问题的答案是:

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

再次感谢大家。

这对你们有用吗

(^[^.]+$)|\.(html?$|php$)
*编辑: 我误解了你的意图。那么这个呢:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} ^[^.]+$ [OR]
RewriteCond %{REQUEST_FILENAME} ^.*\.(html?|php)$
RewriteRule ^(.*)$ bootstrap.php [L,QSA]

好的,看来您的重写工作正常了……您可以看到“testing bootstrap”消息。“无法修改标题”警告与此无关。这意味着您正在尝试执行诸如session_start()或header()之类的操作,或者在您已经输出了某些内容(可能是“testing bootstrap”消息)之后执行某些操作

[好的,这不是这里的具体解决方案,但我会给出一个假答案。]

当mod_重写规则出错时,有时启用。它需要在
httpd.conf
VirtualHost
部分中进行配置,因此需要付出一些努力。但是Apache将在其中列出它执行的顺序和处理操作以及URL。这有助于查看正则表达式是否为Apache所理解,是否按其应有的方式运行

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


如果所有操作都失败,您可能会幸运地临时启用而不是Apache。它附带了一个类似的
mod_rewrite
实现,但是它使用PHPs PCRE后端。(不告诉我为什么我知道。)

可以写得更好一点,但是test.jpg仍然无法与之匹配……除非你喜欢“test.jpg.php”或其他什么……你想用什么模式?(附言——我没有投票结束这个话题……不知道是谁做的,但这个问题与此相关……)我在问题中添加了我如何使用它的信息。谢谢你看这个,很难说。您可能需要尝试使用
重写日志
来找到答案。(我相信mod_rewrite使用标准的posix正则表达式函数,因此它可能不支持替代方案中的^和$)@mario非常感谢您的建议。我不知道这个日志选项。@mario由于你的评论,我解决了它。请参见上面的编辑。如果你把这条评论作为回答,我很乐意接受。不,它会给出同样的结果。上面有一个'('太少或一个')'太多。但是(^[^.]+$)\.(html?$| php$)和(^[^.]+$)\.(html?$| php$)在上述场景中仍然匹配test.jpg。一旦我删除了“|php”,事情就会重新开始。如果我使用“php”而不是“html”,那同样不起作用……谢谢你的回答,我解决了它,请参阅对原始问题的补充。当然可以。但它绝对不能用于“test.jpg”调用。这一警告确实没有关系。我认为这是不可能的。谢谢你指出这令人困惑。
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} ^[^.]+$ [OR]
RewriteCond %{REQUEST_FILENAME} ^.*\.(html?|php)$
RewriteRule ^(.*)$ bootstrap.php [L,QSA]