.htaccess regex不会过滤.php或没有文件扩展名

时间:2018-12-02 18:24:06

标签: regex apache .htaccess url-rewriting

尝试将.htaccess文件设置为将所有以.php结尾或没有文件扩展名的URL直接定向到index.php。因此,像mysite.com/aboutmysite.com/news.php这样的URL会转到index.php,但是mysite.com/someimage.jpgmysite.com/mystyle.css会被正常处理。

当我用常规的旧PHP测试时,我以为有了它,但是.htaccess文件中似乎没有翻译。这是我想出的两个规则:

RewriteRule [A-Za-z0-9]*$ "index.php" [L] # URLs with no extension

RewriteRule [A-Za-z0-9]*\.php$ "index.php" [L] # ending in .php

使用这些规则,不会提供CSS和图像之类的文件,所有内容仍将发送至index.php,因此当浏览器要求提供样式表时,服务器将为index.php提供服务。我尝试注释掉.php规则,因此仅应用了'no extension'规则,结果相同。我曾尝试像在URL开头那样在开头添加一个斜杠,但实际上会破坏事情,因此没有规则适用。

我在这里缺少什么微小但显而易见的细节?

2 个答案:

答案 0 :(得分:2)

您的扩展名以字母字符结尾,因此[A-Za-z0-9]*$jpg的{​​{1}}和.jpg的{​​{1}}匹配。

我认为:

css

将完成您想要的。也就是说,如果文件以.css结尾或完整路径中没有句点,则将其发送到RewriteRule (\.php|^[^.]+)$ "index.php" [L]

https://regex101.com/r/AE8AjY/1/

与您的正则表达式相比:

https://regex101.com/r/AE8AjY/2/(通过将.php设置为可选,将这两个规则合并为一个)

答案 1 :(得分:0)

  1. 主要问题是规则中未使用开始锚。
  2. 规则可以进一步优化。

具有这种方式:

RewriteEngine On

# ignore index.php
RewriteRule ^index\.php$ [L,NC]

# URLs with no extension OR URLs ending with .php
RewriteRule ^[\w-]+(?:\.php)?$ index.php [L,NC]