【问题标题】:Using htaccess to remove .php and allow path使用 htaccess 删除 .php 并允许路径
【发布时间】:2026-02-04 16:25:01
【问题描述】:

我目前有一个 .htaccess 文件,允许人们输入不带 php 扩展名的 URL,这样http://domain.com/account 就会重定向到 account.php

我希望能够拥有它,这样如果我输入 http://domain.com/account/contactinfo(或 http://domain.com/account/settings/groups 等等)它仍然会转到 account.php,但我不确定如何更改我必须实现的目标这个。

当前.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(([A-Za-z0-9\-_\.]+/)*[A-Za-z0-9\-_\.]+)?$ $1.php

任何帮助表示赞赏!显然,如果存在一个文件夹,它应该遵循该路径(例如,如果 /folder/page.php 存在,那么http://domain.com/folder/page/create 将转到文件夹/page.php)

【问题讨论】:

  • 如果用户访问/account/contactinfo 或类似地址,您是否需要将有关附加 URI 部分的任何信息作为查询字符串或任何内容传递?
  • @MikeBrant 是的,我希望查询字符串正常传递
  • 我的意思是,您是否需要获取 URI 的片段并将其作为查询字符串传递,例如 /account/contactinfo 将重定向到 /account.php?q=contactinfo

标签: php apache .htaccess


【解决方案1】:

试试这个,您不需要将任何 URI 信息传递到查询字符串中(即您的应用仍会查看 $_SERVER['REQUEST_URI']

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([A-Za-z0-9\-_\.]+)(/[A-Za-z0-9\-_\.]*)?$ $1.php&q=$2 [QSA]
# Note the optional '&q=$2' on line above if you want to make removed part of URI available as passed parameter

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ / [L,QSA]

请注意,由于我删除了检查有效 php 文件的条件,因此我添加了第二个条件重写规则,如果重写的请求未指向有效的 PHP 文件,则仅重定向到站点根目录。您显然可以将其重定向到 404 页面或您可能想要重定向到的任何其他页面。或者你可以完全删除它,让 Apache 给它默认的 404 响应。

【讨论】:

  • 嗯..奇怪。 %{REQUEST_FILENAME} 应该在第一个规则中写入/*.php,这是一个真实的文件名,这应该是第二个条件的基础。首先,您能否验证第一次重写是否按预期工作?我认为第二部分更好。将标志 R & L 添加到第一条规则中也可能有助于解决问题,例如[R,L,QSA]。这将暂时丢失干净的 URL,但允许您在浏览器中查看重写的实际行为。
  • 我想通了。第一个重写规则应该重写为 $1.php 而不是 /$1.php - 现在它可以工作了!谢谢
  • 哦...所以在子目录或其他东西中工作?对于那个很抱歉。实际上,我从您的初始值更改了它,因为我通常在 Web 根目录中使用 .htaccess,并且喜欢明确声明相对于根目录的重写 URI。我想实际上这会弄乱第二个重写规则,它需要是^/.*$:P 我在我的答案中修复了。
  • 虽然进一步的测试表明 php _SERVER['PATH_INFO'] 变量在这个过程中丢失了(我需要它!:))
  • @BenHolness 你不能通过__FILE____DIR__ 得到那个?