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

Posted

技术标签:

【中文标题】使用 .htaccess 删除 .html 和 .php 扩展名【英文标题】:Remove .html and .php extensions with .htaccess 【发布时间】:2014-03-04 06:14:48 【问题描述】:

如何在不创建新目录和命名文件 index.php 的情况下从我的网页中删除文件类型。我想要http://example.com/google.html 到http://example.com/google。

我该怎么做呢。

PS:我尝试查看其他一些教程,但那里令人困惑。我现在这样做可以在 .htaccess 中完成

【问题讨论】:

@MarcB 是的,我知道。但是我试过了,但它不起作用。另外我需要重命名所有文件。 如果你想学习如何使用 htaccess 从 URL 中删除 phphtml 扩展,你可以试试这个链接 helponnet.com/2020/02/04/… 【参考方案1】:

是的,我知道这个问题已经被问过多次并且得到了回答,但我会根据我的经验给出更全面的答案。

这里是 .htaccess 代码 sn-p 可以帮助你:

# Apache Rewrite Rules
 <IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On
  RewriteBase /

# Add trailing slash to url
  RewriteCond %REQUEST_FILENAME !-f
  RewriteCond %REQUEST_URI !(\.[a-zA-Z0-9]1,5|/|#(.*))$
  RewriteRule ^(.*)$ $1/ [R=301,L]

# Remove .php-extension from url
  RewriteCond %REQUEST_FILENAME !-d
  RewriteCond %REQUEST_FILENAME\.php -f
  RewriteRule ^([^\.]+)/$ $1.php 

# End of Apache Rewrite Rules
 </IfModule>

我想在这里强调一些重要的事情,供大家参考:

此代码 sn-p 不会从 url 中删除入口脚本(例如 index.php 被许多 PHP 框架使用) 它只删除.php扩展名,如果你想删除其他扩展名(例如.html),复制并粘贴第3块并将php替换为其他扩展名。李> 不要忘记同时从锚(链接)href 中删除扩展。

【讨论】:

非常感谢。这正是我想要的。 @SimplePi 比我建议你接受答案并标记它,这样这个问题就不会出现在未回答的问题中。如果您有任何问题,请告诉我,以便我进一步帮助您。 是的,由于限制,我只需要等待几分钟就接受了。【参考方案2】:

@armanP 上面接受的答案不是来自 php url 的 remove .php 扩展名。它只是使访问 php 文件成为可能,而无需在最后使用.php。例如/file.php 可以使用/file/file.php 访问,但这样你就有2 个不同的url 指向同一个位置。

如果要彻底删除.php,可以在/.htaccess中使用以下规则:

RewriteEngine on 
#redirect /file.php to /file
RewriteCond %THE_REQUEST \s/([^.]+)\.php [NC]
RewriteRule ^ /%1 [NE,L,R]
# now we will internally map /file to /file.php
RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^(.*)/?$ /$1.php  [L]

要删除 .html,请使用此

 RewriteEngine on
 #redirect /file.html to /file
 RewriteCond %THE_REQUEST \s/([^.]+)\.html [NC]
 RewriteRule ^ /%1 [NE,L,R]
 # now we will internally map /file to/ file.html
 RewriteCond %REQUEST_FILENAME.html -f
 RewriteRule ^(.*)/?$ /$1.html  [L]

Apache 2.4* 用户解决方案:

如果您的 apache 版本是 2.4,您可以使用不带 RewriteConditions 的代码在 Apache 2.4 上,我们可以使用 END 标志而不是 RewriteCond 来防止无限循环错误。

这是 Apache 2.4 用户的解决方案

 RewriteEngine on

 #redirect  /file.php to /file
  RewriteRule ^(.+).php$ /$1 [L,R]
 # now we will internally map /file to /file.php
 RewriteCond %REQUEST_FILENAME.php -f
RewriteRule ^(.*)/?$ /$1.php [END]

注意:如果您的外部样式表或图像 添加这些规则后未加载,要解决此问题,您可以将链接绝对更改为 &lt;img src="foo.png&gt;&lt;img src="/foo.png&gt;。注意文件名前的 /。或更改 URI 基础,将以下内容添加到网页的 head 部分 &lt;base href="/"&gt;

由于以下原因,您的网页无法加载 css 和 js:

当您的浏览器 url 从 /file.php 更改为 /file 时,服务器认为 /file 是一个目录,并尝试将其附加到所有相对路径的前面。例如:当您的 url 是 http://example.com/file/ 您的相对路径更改为 &lt;img src "/file/foo.png"&gt; 因此图像无法加载。您可以使用我在上一段中提到的解决方案之一来解决此问题。

【讨论】:

谢谢阿米特,你的回答解决了我的问题。我正在使用 NuxtJS,但不知何故 htaccess 无法正常工作。但是您的答案是从 url 中删除 php 和 html 扩展名的最佳解决方案。所以我的路由器现在工作正常。非常感谢。【参考方案3】:

这是删除 .php 时内部路径的修复(使用上面的代码作为参考)。

# Start of Apache Rewrite Rules

 <IfModule mod_rewrite.c>
 
  Options +FollowSymLinks
  RewriteEngine On
  RewriteBase
  
# From http:// to https://
  
  RewriteCond %ENV:HTTPS !=on
  RewriteRule ^.*$ https://%SERVER_NAME%REQUEST_URI [R,L]
  
# Redirect /file.php to /file with POST (enabled)

  RewriteCond %REQUEST_METHOD !POST     
  RewriteCond %THE_REQUEST \s/([^.]+)\.php [NC]
  RewriteRule ^ /%1 [NE,L,R]

# Add trailing slash to url

  RewriteCond %REQUEST_FILENAME !-f
  RewriteCond %REQUEST_URI !(\.[a-zA-Z0-9]1,5|/|#(.*))$
  RewriteRule ^(.*)$ $1/ [L]

# Remove .php-extension from url

  RewriteCond %REQUEST_FILENAME !-d
  RewriteCond %REQUEST_FILENAME\.php -f
  RewriteRule ^([^\.]+)/$ $1.php 

 </IfModule>

# End of Apache Rewrite Rules

注意:

上面是接受不带.php的URL的代码,带.php的URL会在不带.php的情况下被转换(.php会变成已删除)具有各自路径的所有文件/文件夹将正常打开而没有任何问题,post & get 方法也可以正常工作。

【讨论】:

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

使用 htaccess 删除 get 变量和 .php

.htaccess删除部分URL

在 Apache 服务器上获取 .htaccess 文件? (从 url 中删除 html)

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

使用 .htaccess 删除尾部斜杠

如何在计算机上本地创建和编辑 .htaccess 并查看更改