删除带有 .htaccess 的 .php 扩展名

Remove .php extension with .htaccess

提问人:Dirty Bird Design 提问时间:10/27/2010 最后编辑:Stephen OstermillerDirty Bird Design 更新时间:7/20/2023 访问量:347626

问:

是的,我已经阅读了Apache手册并在这里搜索。出于某种原因,我根本无法让它工作。我最接近的是让它删除扩展,但它指向根目录。我希望它只在包含该文件的目录中工作。.htaccess

我需要对文件做三件事。.htaccess

  1. 我需要它来删除.php

一个。我有几个使用选项卡的页面,URL 看起来像 - 这可能吗?page.php#tab

b.我有一个页面使用附加到 URL 的会话 ID,以确保您来自正确的地方,.www.domain.example/download-software.php?abcdefg

这可能吗?同样在这样做时,我是否需要从标题导航包含文件中的链接中删除?应该.phpIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. 我希望它在每个 URL 之前强制,所以它不是 ,而是 .wwwdomain.examplewww.domain.example/page
  2. 我想从页面中删除所有尾部斜杠。

我会继续寻找、尝试等。在子目录中会导致任何问题吗?

Apache .htaccess mod-rewrite

评论

0赞 Dave Jarvis 4/8/2012
如何从网站地址中删除文件扩展名的可能副本?(附样本照片)
0赞 Kellen Stuart 9/21/2016
我只是好奇,这有什么好处?这是否使您的用户不知道他们正在访问您服务器上的哪个文件?
0赞 Dirty Bird Design 9/29/2016
两倍。所以他们不知道我们提供的是什么文件类型,而且它看起来更干净 IMO
0赞 Edward 12/16/2018
另一个相关问题:stackoverflow.com/questions/6534904/......
0赞 Amit Verma 7/20/2021
如果下面提供的解决方案都不起作用。您可以查看这篇文章 helponnet.com/2020/02/04/...并向他们学习如何自己做。

答:

149赞 Pekka 10/27/2010 #1

Gumbo 在 Stack Overflow 问题中的回答 如何使用 Apache mod_rewrite隐藏 .html 扩展应该可以正常工作。

回复 1) 将 .html 更改为 .php

回复 a.)是的,这是可能的,只需添加到 URL。#tab

回复 b.)这可以使用(查询字符串追加),见下文。QSA

这也应该在子目录路径中起作用:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

评论

0赞 Dirty Bird Design 10/27/2010
谢谢你的帮助,无论出于何种原因,由于会话附加的 url 在 PHP 文件中被硬编码(长话短说),我能够在没有上述内容的情况下访问它。我真的很感谢你的帮助,这个.htaccess的东西对我来说很棘手。
9赞 Rahil Wazir 3/3/2014
@Pekka웃 删除空格标志之间的空格,否则将导致 500 内部服务器错误[L,QSA]
1赞 elkebirmed 1/11/2016
这将使/index/bla/blaindex.php
0赞 mmiddleton 10/29/2019
!意味着不是。该规则规定,如果尚未以 .php 结尾,则仅重写以添加.php
76赞 Tim Bielawa 10/27/2010 #2

Apache mod_rewrite

你要找的是mod_rewrite

描述:提供基于规则的重写引擎进行重写 即时请求的 URL。

一般来说,它的工作原理是将请求的文档与指定的正则表达式进行匹配,然后在内部(在 Apache 进程中)或外部(在客户端浏览器中)执行 URL 重写。这些重写可以像在内部转换为 .mod_rewriteexample.com/fooexample.com/foo/bar

Apache文档包括一个指南,我认为其中涵盖了您想要做的一些事情。详细mod_rewrite指南mod_rewrite

强制子域www

我希望它在每个 URL 之前强制执行“www”,所以它不是而是domain.examplewww.domain.example/page

重写指南在 Canonical Hostname 示例下包含相关说明。

删除尾部斜杠(第 1 部分)

我想从页面中删除所有尾部斜杠

我不确定你为什么要这样做,因为重写指南包括一个完全相反的例子,即总是包括一个尾部斜杠。文档建议删除尾部斜杠很有可能导致问题:

尾部斜杠问题

描述:

每个站长都可以唱一首关于尾随问题的歌 在引用目录的 URL 上斜杠。如果缺少它们,则服务器 转储错误,因为如果您说而不是,则服务器会搜索名为 foo 的文件。因为这个文件 是它抱怨的目录。实际上,它试图自行修复它 大多数情况下,但有时需要通过以下方式模拟此机制 你。例如,在你做了很多复杂的URL之后 重写CGI脚本等。/~quux/foo/~quux/foo/

也许您可以扩展一下为什么要一直删除尾部斜杠?

删除扩展.php

我需要它来删除 .php

我能想到的最接近这样做的事情是使用 .php 扩展名在内部重写每个请求文档,即作为 .请注意,以这种方式进行操作将要求每个 somepage 实际上作为 somepage.php 存在于文件系统上。example.com/somepageexample.com/somepage.php

通过正则表达式的正确组合,这在某种程度上应该是可能的。但是,我可以预见到一些可能的问题,即索引页未正确请求且目录未正确匹配。

例如,这将正确地重写为以下请求:example.com/testexample.com/test.php

RewriteEngine  on
RewriteRule ^(.*)$ $1.php

但会因为没有而无法加载example.comexample.com/.php

我猜想,如果您要删除所有尾部斜杠,那么从父目录中的文件名请求中选择目录索引请求将变得几乎不可能。如何确定对目录“foobar”的请求:

example.com/foobar

来自对名为 foobar(实际上是 foobar.php)的文件的请求

example.com/foobar

如果使用 RewriteBase 指令,则可能是可能的。但是,如果您这样做,那么这个问题就会变得更加复杂,因为您将需要 RewriteCond 指令来执行文件系统级别的检查,以检查请求是否映射到目录或文件。

也就是说,如果您删除删除所有尾部斜杠的要求,而是强制添加尾部斜杠,“没有 .php 扩展名”问题变得更加合理。

# Turn on the rewrite engine
RewriteEngine  on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]

这仍然不完美 - 每个文件请求仍然在内部将 .php 附加到请求中。对“hi.txt”的请求会将其放入错误日志中:

[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat

但是还有另一种选择,设置如下所示的 and 指令:DefaultTypeDirectoryIndex

DefaultType application/x-httpd-php
DirectoryIndex index.php index.html

更新 2013-11-14 - 修复了上述片段以纳入 nicorellius 的观察结果

现在对 hi.txt(和其他任何内容)的请求成功,请求将返回已处理的 test.php 版本,索引 .php 文件将再次工作。example.com/test

我必须为这个解决方案提供应有的荣誉,因为我通过在 Google 上搜索 php no extension apache 找到了它 Michael J. Radwins 博客

删除尾部斜杠

一些搜索将我带到了一些搜索引擎优化页面。显然,一些内容管理系统(在这种情况下是Drupal)会在URL中提供带有和不带有尾部斜杠的内容,这在SEO世界中将导致您的网站产生重复的内容惩罚。apache remove trailing slashes

该解决方案似乎相当微不足道,使用mod_rewrite我们在请求的资源以 a 结尾的条件下重写,并通过发送回 HTTP 标头来重写 URL。/301 Permanent Redirect

下面是他的例子,它假设你的域是 blamcast.net 的,并允许请求可以选择性地以 .www.

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

现在我们到了某个地方。让我们把它们放在一起,看看它是什么样子的。

必填 、 否 和 无尾斜杠www..php

这假定域是,并且它正在标准端口 80 上运行。foobar.example

# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html

# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST}   !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST}   !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*)         http://www.foobar.example/$1 [L,R,NE]

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

“R”标志在 RewriteRule 指令节中进行了描述。片段:

redirect|R [=code](强制重定向)前缀替换为(使新 URL 成为 URI)以强制 外部重定向。如果未给出代码,则 HTTP 响应 302 (暂时移动)将被退回。http://thishost[:thisport]/

结语

我无法成功删除斜杠。重定向最终给了我无限的重定向循环。在仔细阅读原始解决方案后,我的印象是上面的示例对他们有用,因为他们的 Drupal 安装是如何配置的。他特别提到:

在普通的 Drupal 站点上,启用干净的 URL 后,这两个地址 基本上是可以互换的

引用以斜杠结尾和不以斜杠结尾的 URL。此外

Drupal 使用一个名为的文件来告诉您的 Web 服务器如何 句柄 URL。这与启用 Drupal 的干净 URL 的文件相同 魔法。通过在文件的开头添加一个简单的重定向命令,您可以强制服务器自动删除任何 尾部斜杠。.htaccess.htaccess

评论

0赞 Dirty Bird Design 10/27/2010
哇,谢谢你。实际上,我能够让它工作,结果发现我的服务器上有一些奇怪的东西,我必须更改。无论如何,现在进入下一个问题,从除一个页面之外的所有页面中删除 .php。谢谢人
0赞 nicorellius 11/9/2013
我喜欢看到经过深思熟虑、有条理的答案。干得好...我注意到一件事:你的意思是?或?DirectoryIndex index index.htmlDirectoryIndex index.php index.html
0赞 Tim Bielawa 11/15/2013
@nicorellius相信你是对的。我已经用你的观察更新了我原来的答案。
1赞 DonJoe 6/10/2018
我必须说这并不总是有效。请尝试以下答案(用户1079877)
0赞 ZainZaheer06 8/20/2019
你是真正的MVP。
2赞 Jeff Hays 3/15/2013 #3

如果您正在使用 PHP 编码并想要删除 .php,以便您可以拥有如下 URL:

http://yourdomain.example/blah-> 指向 /blah.php

这就是您所需要的:

<IfModule mod_rewrite.c>
    RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
8赞 Jon 9/18/2013 #4

不知道为什么其他答案对我不起作用,但我找到的这段代码确实如此:

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

这就是我的 htaccess 和显示的全部内容example.com/pageexample.com/page.php

26赞 user1079877 10/14/2013 #5

以下代码对我来说很好:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php

评论

0赞 earth2jason 9/11/2014
这有效,除了 example.com 变成所有文件和目录的索引。(Apache 2.4)
14赞 sbuck 3/6/2014 #6

如果您只想对一个特定文件执行此操作,请执行以下方法:

RewriteRule ^about$ about.php [L]

编号: http://css-tricks.com/snippets/htaccess/remove-file-extention-from-urls/

1赞 Kamlesh Kumar 1/7/2015 #7

如果你的 URL 在 PHP 中喜欢 than 喜欢http://yourdomain.example/demo.phphttp://yourdomain.example/demo

这就是您所需要的:

create file .htaccess

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

评论

0赞 Wesley Gonçalves 3/7/2019
它有效,但不起作用(索引文件)。你能帮我让它为索引文件工作吗?http://example.com/myfilehttp://example.com/myfolder/
0赞 Kamlesh Kumar 3/7/2019
我认为您应该尝试上面@starkeen答案 URL:stackoverflow.com/a/30566026/3786343
65赞 Amit Verma 6/1/2015 #8

除了上面的其他答案,

您也可以尝试这样做以从文件中完全删除扩展名并避免无限循环.php

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [NC,L]

此代码将在 Root/.htaccess 中工作, 如果要将其放在子目录中的htaccess文件中,请务必更改RewriteBase。

在 Apache 2.4 及更高版本上,您还可以使用 END 标志来防止无限循环错误。以下示例在 Apache 2.4 上的工作方式与上述相同,

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]

评论

1赞 ethry 11/1/2022
与其他文件夹不同,这个也适用于文件夹(example.com/1(php 文件)和 example.com/2/(文件夹)工作),但是重定向会破坏表单。
1赞 Shurvir Mori 7/20/2023
这应该是公认的答案。!!!🎉🎉
5赞 Sanjeev Kumar 7/19/2015 #9

要从 PHP 文件中删除扩展名,例如:从您网站的根目录打开 .htaccess(如果不存在,请创建一个新扩展名)文件,并添加以下代码。.phpyoursite.example/about.phpyoursite.example/about

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

要从 HTML 文件中删除扩展名,例如:从网站根目录打开 .htaccess(如果不存在,请创建一个新扩展名)文件,并添加以下代码。.htmlyoursite.example/about.htmlyoursite.example/about

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

参考:如何从 URL 中删除 PHP 扩展

评论

0赞 ethry 11/1/2022
这会破坏文件夹。
2赞 Irshad Khan 3/30/2016 #10

我找到了 100% 适合我的概念:

# Options is required by Many Hosting
Options +MultiViews

RewriteEngine on

# For .php & .html URL's:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1.html [NC,L]

在网站的根目录中使用此代码 .htaccess 文件,如:

离线 - wamp\www\YourWebDir

在线 - public_html/

如果它无法正常工作,请更改 Wamp 的设置 服务器: 1) 左键点击 WAMP 图标 2) Apache 3) Apache 模块 4) 左键 单击rewrite_module

评论

1赞 MD XF 2/8/2017
标签不能相邻的两个 s。 表示这是指定 .RewriteRuleL[L]mod_rewriteRewriteCond
0赞 MrWhite 10/19/2021
正是它使它起作用(其余的指令可以删除)!但现在这意味着任何 URL 都可以在没有扩展名的情况下调用(包括您的所有图像、CSS、JS 等)。Options +MultiViews
15赞 Rodney Salcedo 4/22/2016 #11

将参数从 to in (Debian 8) 更改后,.htaccess 文件必须包含:AllowOverrideNoneAll/etc/apache2/apache2.conf

Options +MultiViews
AddHandler php5-script php
AddType text/html php

从文件中隐藏 .php 扩展名就足够了

评论

1赞 Phil 1/19/2018
希望这个更高。为什么要为URL重写的开销而烦恼,什么时候开箱即用MultiViews
0赞 reformed 3/6/2018
这太棒了。有什么缺点吗?
0赞 Rodney Salcedo 3/14/2018
@reformed 谢谢。我不得不在源代码中将链接从一个链接更改为另一个链接<a href="somepage.php"></a><a href="somepage"></a>
1赞 MrWhite 10/19/2021
MultiViews有效地在所有内容上启用无扩展名 URL。您的所有静态资源(图像、CSS、JS 等)也可以访问,无论是否使用文件扩展名。但是,最大的“缺点”之一是与mod_rewrite的意外冲突,因为 MultiViews (mod_negotiation) 是先处理的,并在将“重写”的 URL 交给mod_rewrite之前有效地重写 URL。这可能会导致 mod_rewrite 指令与预期的请求不匹配。@reformed
0赞 Matias Jimenez 10/27/2022
2022 年仍然有效
2赞 Rahul Gupta 2/22/2017 #12

这是我用来从文件名中隐藏 .php 扩展名的代码:

## hide .php extension
# To redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L,NC]

注意:R=301 用于永久重定向,建议用于 SEO 目的。但是,如果只想进行临时重定向,请将其替换为 R

9赞 Samarth Saxena 3/13/2019 #13

试试这个
以下代码肯定会起作用

RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
2赞 Inderjeet 1/18/2020 #14

尝试

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

评论

0赞 AamirSohailKmAs 1/13/2022
如果您有 .php 以外的扩展名(例如 .txt),那么这个答案会有所帮助。
15赞 Nadeem 6/22/2020 #15

我最终得到了以下工作代码:

RewriteEngine on 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
3赞 Naresh Choudhary 8/5/2021 #16

试试这个:-

RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

评论

0赞 ethry 11/1/2022
“禁止访问此资源:您无权访问此资源。”请解释一下
-1赞 Ravendra Kumar 4/15/2022 #17
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"   
RewriteRule .* - [L,R=404]

评论

7赞 Yunnosch 8/31/2022
虽然这段代码可以解决这个问题,但包括解释它如何以及为什么解决这个问题,将真正有助于提高你的帖子的质量,并可能导致更多的赞成票。请记住,您是在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释,并指出适用的限制和假设。
0赞 ethry 11/1/2022
这是行不通的。如果确实如此,解释会有所帮助。
0赞 Mekey Salaria 4/16/2023
不起作用..
1赞 Shurvir Mori 7/20/2023 #18

对于 AWS 托管(Ubuntu 相关服务器)站点

步骤 1 :您需要编辑位于 中的 apache2 配置文件。/etc/apache2/apache2.conf

sudo nano /etc/apache2/apache2.conf

步骤 2 :您必须编辑如下所示的行:

<Directory /var/www/html/>
  Option Indexes FollowSymbLinks
  AllowOverride None    <-------- FOCUS ON THIS
  Require all granted
</Directory>

您需要将 替换为 ,然后您需要在终端的 apache2 中启用重写模式:AllowOverride NoneAllowOverride All

sudo a2enmod rewrite

步骤 3 :重新启动 Apache

sudo service apache2 restart

步骤 4 :然后你可以编辑文件。.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [NC,L]