【问题标题】:Remove .php extensions with .htaccess without breaking DirectoryIndex使用 .htaccess 删除 .php 扩展名而不破坏 DirectoryIndex
【发布时间】:2026-02-19 00:15:01
【问题描述】:

我在我的 .htaccess 文件中进行了以下重写,它从文件中删除了 .php 扩展名,例如将 so.com/question.php 转换为 so.com/question em>。

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

但是,这也破坏了默认的 DirectoryIndex 行为,在这种行为中,只需键入目录就会重定向到文件夹中的索引文件,例如so.com/answer 显示 so.com/answer/index.php

简单地将上述代码与DirectoryIndex index.php 结合并不能同时达到这两种结果。

谁能帮我把这两个函数结合起来,或者重写代码排除index.php文件,也能达到同样的效果?

【问题讨论】:

    标签: .htaccess url-rewriting


    【解决方案1】:

    我认为您只需要在进行重写之前验证文件是否存在,这样您就可以保持 404 和 directoryindex 行为完好无损:

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

    (未测试)

    【讨论】:

    【解决方案2】:
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME}\.php -f 
    RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [L, QSA]
    

    验证文件和文件夹,并添加 RewriteBase /

    【讨论】:

    • 这个给出了内部服务器错误:(
    • 奇怪...你还添加引擎吗? :)
    • 是的,我加入了RewriteEngine On :)
    • @Crsr,就像你不会在 cond 的第一个参数上逃避 . 一样。 :-
    【解决方案3】:
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php
    

    我测试过,它工作正常。

    【讨论】:

      最近更新 更多