Apache .htaccess 重写规则以删除 .php 文件扩展名

Posted

技术标签:

【中文标题】Apache .htaccess 重写规则以删除 .php 文件扩展名【英文标题】:Apache .htacces Rewrite Rule to Remove .php File Extensions 【发布时间】:2011-08-29 02:02:27 【问题描述】:

标题解释了基础知识,现在问题来了:

我有很多类似这样的文件:

<?php include 'mynavbar.php';   
include 'myheader.php';    
include 'myfirstline.php'; 
include 'mybuttons.php';   
include 'myadvert.php'; 
include 'myimg.php';?>

而且我无法编辑所有文件并删除.php。如何在地址栏中不显示.php,但仍然可以使用.php 结尾来包含页面

【问题讨论】:

【参考方案1】:

以下代码应该适用于您在 .htaccess 文件中隐藏 .php 扩展名:

Options +FollowSymlinks -MultiViews
RewriteEngine on

# to make `/path/index.php` to /path/
RewriteCond %THE_REQUEST ^GET\s(.*/)index\.php [NC]
RewriteRule . %1 [NE,R=301,L]

RewriteCond %THE_REQUEST ^GET\s.+\.php [NC]
RewriteRule ^(.+)\.php$ /$1 [NE,R=301,L,NC]

RewriteCond %REQUEST_FILENAME !-d
RewriteCond %DOCUMENT_ROOT/$1.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

还请记住,这些规则会对您的 php 产生NO影响,包括例如:include 'myheader.php';

这是因为这些包含是由 php 自己处理的,不经过 Apache。

【讨论】:

我已经尝试了 10 条重写规则,但都没有奏效。这个完美。非常感谢! 如果你好心,你能告诉我如何删除主页的“/index”吗? ;;) 关于could I also remove the "/index" for the homepage 当然,我也会尝试提出该规则条件。稍后会更新答案。 @Cristy:编辑了我上面的答案,以确保删除 /index 请验证。 这很好用,除了在导航到/foo/ 的情况下 - 尾部的斜线使它在尝试寻找foo/.php 时出错 无论如何要让这个工作?谢谢!【参考方案2】:

您没有采取正确的方法来解决您试图解决的问题。

如果我理解得很好,你想做的是有一个像这样的网址:

http://example.com/my/url

而不是(例如):

http://example.com/my/url.php

如果是这种情况,你应该寻找的是rewrite url

【讨论】:

这是一个非常低质量的答案。您没有向社区添加任何内容。 感谢您指出这一点。我应该在网络上复制已经存在 200^2000 次的东西,只是为了获得比 url 更有用的东西来分享。因为我确定你相信我的回答不正确?好孩子…… 我很欣赏你的评论,但我认为改变我的评论没有用:改成什么?如果我编辑它以插入解决方案,我只会复制接受的答案。对于他的要求,接受的答案是完整的,我的答案更通才,因为当时,我认为这个问题需要一个比特定答案更好的通才答案(通过谷歌)。我认为提出问题的用户是从 .htaccess/url-rewriting 开始,并将他重定向到更多链接,而不仅仅是他的具体答案更有帮助。这就是为什么。 我接受您的反对票,因为 1. 您将自己描述为反对票(这是一个很好的步骤) 2. 您解释了原因。大多数投反对票的人都没有花时间解释原因。我相信,当您对某些内容投反对票时,比以往任何时候都更需要解释原因,因为您可以帮助作者理解他的错误(或为什么您不同意他的观点)。 感谢您的 cmets。至少这里有一些对您的 cmets 的支持 :-)【参考方案3】:

以下 RewriteRules 将 假定任何不匹配的文件的 PHP 扩展名。它应该位于 .htaccess 文件中 RewriteRules 的底部。

# Force PHP extension if not a directory
RewriteCond %DOCUMENT_ROOT%REQUEST_URI -d
RewriteRule ^(.*)$ - [L]

RewriteCond %DOCUMENT_ROOT/$1.php -f
RewriteRule ^((.*/)*[^./]+)/*$ $1.php [L]

这是用于 URL 重写。至于 include 语句,您仍然需要 PHP 扩展,因为它们是 物理 文件路径。如果你需要在那里做一些花哨的东西,你应该看看符号链接。

【讨论】:

以上是关于Apache .htaccess 重写规则以删除 .php 文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章

apache_conf HtAccess重写规则

您是不是必须重新启动apache才能使.htaccess中的重写规则生效?

apache的重写规则

htaccess编写规则

如何在 .Htaccess 中禁用/不允许共享主机 RewriteLog 时,在 Apache 2 中模拟和测试 URL 重写规则?

apache_conf 通过htaccess重写规则从暂存加载缺失的图像