【问题标题】:.htaccess regex won't filter for .php or no file extension.htaccess 正则表达式不会过滤 .php 或没有文件扩展名
【发布时间】:2018-12-03 02:40:12
【问题描述】:

尝试设置一个.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 规则,所以只应用“无扩展”规则,结果相同。我尝试在开头添加一个斜杠,就像在 URL 中一样,这实际上破坏了一些规则,因此没有应用任何规则。

我在这里遗漏了哪些微小但明显的细节?

【问题讨论】:

  • 如果有疑问,启用/查看重写日志通常会有所帮助 - 至少对于重叠/相似的规则。
  • 我不知道重写日志。刚打开它。谢谢!

标签: regex apache .htaccess url-rewriting


【解决方案1】:

您的扩展名以字母字符结尾,因此[A-Za-z0-9]*$.jpgjpg.csscss 匹配。

我认为:

RewriteRule (\.php|^[^.]+)$ "index.php" [L]

会完成你想要的。也就是说,如果文件以 .php 结尾或完整路径中没有句点,请将其发送到 index.php

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

与您的正则表达式相比:

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

【讨论】:

  • 我认为做到了。谢谢!最初我有 \/ 的规则(尝试使用和不使用转义斜杠),因此 URL 中最后一个斜杠之后的任何内容都必须有 .php 或只有字母和数字。就像我说的那样,这只是阻止了规则的工作。你知道为什么会这样吗?
  • PHP 中的.htaccess 中的斜杠不需要转义,只有在它们用作正则表达式的分隔符时才需要转义。您可以发布您正在尝试的完整正则表达式吗?您的 htaccess 文件中是否定义了基数?
  • 当然。最初我尝试的两条规则是:RewriteRule /[a-zA-Z0-9]*$ "index.php"RewriteRule /[a-zA-Z0-9]*\.php$ "index.php" 当它们不起作用时,我开始尝试逃跑并做其他事情。 htaccess 中没有定义的基础,没有。我只关心 URL 中最后一个斜杠之后发生了什么。
【解决方案2】:
  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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2013-03-18
    相关资源
    最近更新 更多