我想这将是一个愚蠢的问题,但我不知道这里发生了什么.我想通过.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,他通过下面的评论帮我解决了这个问题.
这确实是一个愚蠢的问题.以下是发生的事情:
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'
...
所以问题是我的404文档以* .php结束,这就是为什么* .jpg匹配未找到的文件.啊蝙蝠,我会搜索这个很长一段时间……
所以这样做:
RewriteRule ([^4]?[^0]?[^4]\.php) bootstrap.php [L,QSA]
那么,完整的问题的答案是:
RewriteRule (^[^.]+$)|(\.html?$)|([^4]?[^0]?[^4]\.php) bootstrap.php [L,QSA]
再次:谢谢大家.