【问题标题】:.htaccess script to remove .php extension prevents index.php access.htaccess 脚本删除 .php 扩展名会阻止 index.php 访问
【发布时间】:2022-01-10 20:26:07
【问题描述】:

我想在访问我的网页时使用以下脚本删除.php 扩展名。但是,这会阻止我通过简单地转到主网站 URL 来访问该网站的 index.php

如何解决此问题,以便删除两个 .php 扩展名,而我只需输入网站名称即可访问 index.php

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

【问题讨论】:

  • 当你请求文档根目录时,这条规则实际上并没有做任何事情,即。 “主网站 URL”,因为正则表达式 ^([^\.]+)$ 不匹配。您的 .htaccess 文件中还有哪些其他指令?
  • @MrWhite 这是所有脚本
  • 澄清一下,如果您删除这 3 行,那么您可以通过简单地请求主网站 URL 来访问 index.php,例如。 https://example.com/?
  • 你使用的是什么版本的 Apache?
  • 当“转到主网站 URL”时,您实际上得到了什么响应? 403、404、500、...?另外,请说明您请求的网址?

标签: php .htaccess mod-rewrite


【解决方案1】:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

这应该已经允许您在访问主网站 URL(即https://example.com)时访问 index.php(DirectoryIndex 文档),因为正则表达式 ^([^\.]+)$(注意 + 量词)不匹配请求文档根目录(主网站 URL) - 因此该规则不应该做任何事情并且请求通过,就好像该规则不存在一样。

通常,唯一会失败的情况是DirectoryIndex index.php 未正确设置或指令在服务器 上下文中使用(即不是.htaccess)。但是您已经证明必须设置DirectoryIndex,因为当指令被完全删除时,这可以正常工作。如果 DirectoryIndex 设置不正确,那么您将获得 403 Forbidden,而不是您似乎得到的 404。所以,这里似乎有其他事情发生了。

如果在处理上述指令之前请求以某种方式重写为index.php(尽管这不会在 Apache 上发生 - 也许它会在 LiteSpeed 上发生?)然后正则表达式 (RewriteRule pattern ) 仍然不匹配,因为字符类不包括点(如<dot>php)。虽然前面的条件应该已经排除了映射到物理文件的任何请求。

另一方面,404 与错误重写的请求一致。


但是,此规则并不完全正确,因为无论目标文件(带有.php 扩展名)是否存在,它都会重写请求(即附加.php 扩展名)。任何没有立即映射到文件的请求都会被重写。这包括目录(并且文档根是一个目录)。

请尝试以下方法:

DirectoryIndex index.php

RewriteEngine On

# Rewrite to append ".php" only if the corresponding ".php" file exists
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.]+)$ $1.php [L]

现在在重写请求之前检查目标.php 文件是否存在。

DirectoryIndex 指令只是为了确保。但也删除了可能在服务器配置中设置的任何不必要的DirectoryIndex 文档。

小点:

  • 在字符类中使用时无需对文字点进行反斜杠转义,因为它在这里没有特殊含义。
  • RewriteRule 上的 NC 标志是多余的,因为正则表达式已经匹配大小写字母。

确保在测试前清除浏览器缓存。

【讨论】:

    【解决方案2】:

    您可以在当前规则之上添加一个新规则来检查空路径(根)并将其重写为 index.php,如下所示:

    RewriteEngine On
    RewriteRule ^$ index.php [NC,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^\.]+)$ $1.php [NC,L]
    

    【讨论】:

    • 另外,您可以使用htaccess.madewithlove.com 之类的工具来调试您的.htaccess 规则
    • 小心,这会导致RewriteCond 只应用于第一个新规则!几乎没有你想要的!
    • 这与我发布的原始脚本类似。输入基本 URL 时,我收到 404 Not Found 错误,必须显式输入 /index.php
    • @ArianTabriz 我已经对此进行了测试,它确实对我有用。您是否使用我在评论中提到的工具对其进行了测试?
    • @DerLola 我不确定该工具是否适合我,我正在 localhost 中进行测试
    猜你喜欢
    • 2011-03-02
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2011-04-30
    相关资源
    最近更新 更多