使用 .htaccess 删除 .php 扩展名

Posted

技术标签:

【中文标题】使用 .htaccess 删除 .php 扩展名【英文标题】:Remove .php extension with .htaccess 【发布时间】:2011-04-30 20:58:35 【问题描述】:

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

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

    我需要它来删除.php

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

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

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

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

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

【问题讨论】:

How to remove file extension from website address? (sample photos attached)的可能重复 我只是好奇,这有什么好处?这是为了让您的用户不知道他们正在访问您服务器上的什么文件? 两折。所以他们不知道我们提供什么文件类型,而且它看起来更干净 IMO 另一个相关问题:***.com/questions/6534904/…. 如果以下提供的解决方案均无效。你可以看看这个帖子helponnet.com/2020/02/04/… 并学习他们如何自己做。 【参考方案1】:

Gumbo 在 Stack Overflow 问题中的回答 How to hide the .html extension with Apache mod_rewrite 应该可以正常工作。

Re 1) 将 .html 更改为 .php

Re a.) 是的,这是可能的,只需在 URL 中添加 #tab

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

应该也可以在子目录路径中工作:

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

【讨论】:

感谢您的帮助,无论出于何种原因,我敢打赌,由于会话附加的 url 被硬编码在 PHP 文件中(长故事),我可以在没有上述内容的情况下访问它。非常感谢您的帮助,这个 .htaccess 东西对我来说很棘手。 @Pekka웃 删除[L,空间QSA]标志之间的空格,否则会导致500 Internal Server Error 这将使/index/bla/blaindex.php 相同 由于某种原因,这会阻止我的 CSS 加载:/ !意味着没有。该规则说仅重写以添加 .php 如果它还没有以 .php 结尾【参考方案2】:

Apache mod_rewrite

你要找的是mod_rewrite,

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

一般来说,mod_rewrite 通过将请求的文档与指定的正则表达式匹配,然后在内部(在 apache 进程内)或在外部(在客户端浏览器中)执行 URL 重写。这些重写可以像在内部将 example.com/foo 转换为对 example.com/foo/bar 的请求一样简单。

Apache 文档包含一个mod_rewrite 指南,我认为您想要做的一些事情都包含在其中。 Detailed mod_rewrite guide.

强制www 子域

我希望它在每个 url 之前强制“www”,所以它不是 domain.com 而是 www.domain.com/page

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

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

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

我不确定您为什么要这样做,因为重写指南包含 an example for the exact opposite,即始终包含尾部斜杠。文档建议删除尾部斜杠很有可能导致问题:

斜线问题

说明:

每个站长都可以唱一首关于拖尾问题的歌 引用目录的 URL 上的斜线。如果它们丢失,服务器 转储一个错误,因为如果你说 /~quux/foo 而不是 /~quux/foo/ 然后服务器搜索名为 foo 的文件。因为这个文件 是它抱怨的目录。实际上它试图自行修复 大多数情况下,但有时这种机制需要由 你。例如,在您完成了很多复杂的 URL 之后 重写为 CGI 脚本等。

也许您可以详细说明为什么要一直删除尾部斜杠?

删除.php 扩展

我需要它来删除 .php

我能想到的最接近的做法是在内部重写每个带有 .php 扩展名的请求文档,即 example.com/somepage 被作为对 example.com/somepage.php 的请求进行处理。请注意,以这种方式进行操作将要求每个 somepage 都以 somepage.php 的形式存在于文件系统中。

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

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

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

但是会导致example.com加载失败,因为没有example.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

但还有另一种选择,像这样设置DefaultTypeDirectoryIndex 指令:

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

2013-11-14 更新 - 修复了上述 sn-p 以纳入 nicorellius 的观察

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

我必须在应归功于此解决方案的地方给予信任,因为我通过在 Google 中搜索 php no extension apache 找到了 Michael J. Radwins Blog。

删除尾部斜杠

一些搜索apache remove trailing slashes 将我带到一些搜索引擎优化页面。显然,一些内容管理系统(在这种情况下为 Drupal)将使内容在 URls 中有或没有尾随斜杠的情况下可用,这在 SEO 世界中会导致您的网站遭受重复的内容惩罚。 Source

解决方案似乎相当简单,我们使用mod_rewrite 重写,条件是请求的资源以/ 结尾,并通过发回301 Permanent Redirect HTTP 标头来重写URL。

这是他的示例,假设您的域是 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,并且没有尾部斜杠

这假设域是 foobar.com 并且它在标准端口 80 上运行。

# 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.com/$1 [L,R,NE]

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

RewriteRule 指令部分中描述了“R”标志。片段:

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

最后说明

我无法成功删除斜线。重定向最终给了我无限的重定向循环。在仔细阅读the original solution 之后,我得到的印象是上面的示例适用于他们,因为他们的 Drupal 安装是如何配置的。他特别提到:

在正常的 Drupal 站点上,启用干净的 URL,这两个地址 基本可以互换

参考以斜杠结尾和不以斜杠结尾的 URL。此外,

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

【讨论】:

哇,感谢您所做的一切。实际上我能够让它工作,结果我的服务器上有一些奇怪的东西我不得不改变。无论如何,现在进入下一个问题,从除一个之外的所有页面中删除 .php。谢谢男人 我喜欢看到经过深思熟虑、有条理的答案。干得好......我注意到一件事:你的意思是DirectoryIndex index index.html?或DirectoryIndex index.php index.html? @nicorellius 相信您是正确的。我已经根据您的观察更新了我原来的答案。 我必须说这并不总是有效。试试下面的答案(用户 1079877) 你是真正的MVP。【参考方案3】:

除了以上其他答案,

您也可以尝试这样从文件中完全删除 .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]

【讨论】:

【参考方案4】:

以下代码对我来说很好用:

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

【讨论】:

这个工作除了 example.com 变成所有文件和目录的索引。 (Apache 2.4)【参考方案5】:

/etc/apache2/apache2.conf (Debian 8) 中将参数AllowOverrideNone 更改为All 后,在this 之后,.htaccess 文件必须包含:

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

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

【讨论】:

希望这个更高。当MultiViews 开箱即用时,为什么还要为 URL 重写的开销而烦恼 这很棒。有什么缺点吗? @reformed 谢谢。我不得不将源代码中的链接从 <a href="somepage.php">link</a> 更改为 <a href="somepage">link</a> MultiViews 有效地在 everything 上启用无扩展 URL。您的所有静态资源(图像、CSS、JS 等)也可以使用和不使用文件扩展名进行访问。然而,最大的“缺点”之一是与 mod_rewrite 的意外冲突,因为首先处理 MultiViews (mod_negotiation) 并在将“重写” URL 交给 mod_rewrite 之前有效地重写 URL。这可能会导致 mod_rewrite 指令与您期望的请求不匹配。 @改革【参考方案6】:

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

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

RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^ %REQUEST_URI.php [NC,L]

【讨论】:

添加后页面不会发布。 我的错,这似乎工作得很好——我第一次遇到与上述代码无关的错误。【参考方案7】:

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

RewriteRule ^about$ about.php [L]

参考:http://css-tricks.com/snippets/htaccess/remove-file-extention-from-urls/

【讨论】:

【参考方案8】:

试试这个 下面的代码肯定会工作

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

RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^ %REQUEST_URI.php [NC,L]

【讨论】:

无法使用此解决方案发布。【参考方案9】:

不知道为什么其他答案对我不起作用,但我发现的这段代码确实有效:

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

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

【讨论】:

【参考方案10】:

从 PHP 文件中删除 .php 扩展名,例如 yoursite.com/about.php 到 yoursite.com/about 遵循这些步骤。 从您网站的根目录打开 .htaccess(如果不存在则创建新的) 文件,并添加以下代码。

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

要从 html 文件中删除 .html 扩展名,例如 yoursite.com/about.html 到 yoursite.com/about,请按照以下步骤操作。

从您网站的根目录打开 .htaccess(如果不存在则创建新的) 文件,并添加以下代码。

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

参考:How to Remove php Extention from URL

【讨论】:

【参考方案11】:

如果您使用 PHP 进行编码并想删除 .php,那么您可以使用如下 URL:

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

这就是你所需要的:

<IfModule mod_rewrite.c>
    RewriteRule ^(.+)/$ http://%HTTP_HOST/$1 [R=301,L]
</IfModule>

【讨论】:

【参考方案12】:

我发现 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

【讨论】:

您不能将两个带有标签LRewriteRules 并排放置。 [L] 告诉 mod_rewrite 这是指定 RewriteCond 的最后一条规则。 这是Options +MultiViews 使这项工作(可以删除其余指令)!但这现在意味着可以在没有扩展名的情况下调用 任何 URL(包括所有图像、CSS、JS 等)。【参考方案13】:

这是我用来从文件名中隐藏 .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

【讨论】:

【参考方案14】:

试试

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

【讨论】:

如果您有 .php 以外的扩展名(例如 .txt),那么这个答案会有所帮助。【参考方案15】:

试试这个:-

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

【讨论】:

【参考方案16】:

如果你在 PHP 中的 URL 像 http://yourdomain.com/demo.php 那样 http://yourdomain.com/demo

这就是你所需要的:

创建文件 .htaccess

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

【讨论】:

它适用于http://example.com/myfile,但不适用于http://example.com/myfolder/(索引文件)。你能帮我使它适用于索引文件吗? 我觉得你应该试试上面的@starkeen回答网址:***.com/a/30566026/3786343 如果您请求未映射到 .php(或 .html)文件的 /anything-that-does-not-exist,这将创建一个重写循环(500 错误)。因此,您的大多数 404 将变成 500,并且您的服务器负载可能会增加(因为重写循环)。

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

尝试使用 .htaccess 文件删除 .php 扩展名时出现 403 禁止错误

使用 .htaccess 删除 .php 扩展名会重复我的页面吗?

使用 .htaccess 删除 .html 和 .php 扩展名

.htaccess 文件 - 删除 .php 扩展名“服务器错误”[重复]

htaccess删除除了一个特定文件夹之外的php扩展名

使用 .htaccess 删除和禁止扩展名