.htaccess正则表达式匹配文件与扩展名或没有扩展名

时间:2015-04-01 15:02:01

标签: regex .htaccess

基本上我想将协议之后的文件路径下面的任何模式匹配到文件名,即使文件没有扩展名。

我几乎到了那里,但是一旦我尝试使它与没有扩展名的文件匹配,它就匹配到该行的其余部分。

我的测试字符串

http://regexr.com/foo.html?test (//regexr.com/foo.html)

http://regexr.com/foo?test      (//regexr.com/foo)

http://regexr.com/foo.php?test  (//regexr.com/foo.htm)

http://regexr.com/foo.htm?test  (//regexr.com/foo.htm)

我当前的表达式是\/(.+)\.php但是这与没有扩展名的第二个文件路径不匹配,如果我使最后一个集合成为可选项,它会通过GET参数进行选择。任何帮助将不胜感激。


编辑以下是我正在尝试修改的.htaccess块

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} \ /(.+)(\.php|\.html?)
RewriteRule ^ /%1.aspx [L,R=301]
RewriteRule ^(.*).aspx$ $1.php [QSA]

进一步编辑 正如所指出的,这可能更好地被要求作为重定向问题。 (另一个注意事项,我删除了html重定向,因为它会导致性能下降,因此扩展名为*.php的文件是唯一被重定向的文件。)

这些是我希望处理文件的方式; 301重定向到新地址,然后由服务器继续作为PHP处理:

http://regexr.com/foo.html (Doesn't redirect, not processed)
http://regexr.com/foo      (R to /foo.aspx, processed as /foo.php)
http://regexr.com/foo.php  (R to /foo.aspx, processed as /foo.php)
http://regexr.com/foo.htm  (Doesn't redirect, not processed)
http://regexr.com/foo.aspx (Doesn't redirect, processed as /foo.php)

1 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式模式:

\s/([^?.]+)(?:\.php|\.html?)?[?\s]

RegEx Demo


重定向规则:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} \s/([^?.]+)(?:\.php)?[?\s] [NC]
RewriteRule ^ /%1.aspx? [L,R=302]

RewriteRule ^(.+?)\.aspx$ $1.php [L,NC]