使用.htaccess文件移除.html和.php扩展名

15

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

应该如何处理此问题。

PS:我尝试查看一些其他教程,但它们太复杂了。我知道可以在.htaccess中完成此操作。


@MarcB 是的,我知道。但是我尝试过了,它不起作用。而且我需要重命名所有的文件。 - SimplePi
如果你想学习如何使用htaccess从URL中删除phphtml扩展名,可以尝试访问这个链接:https://helponnet.com/2020/02/04/remove-html-and-php-extension-with-htaccess-rewriterule-url-rewriting-tips/。 - Amit Verma
3个回答

23

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

以下是一个.htaccess代码片段,可以帮助您:

# 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>

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

  • 这段代码不能从URL中移除入口脚本(例如许多 PHP 框架使用的 index.php)。
  • 它只会删除 .php 扩展名,如果您还想删除其他扩展名(例如 .html),请复制并粘贴第三个代码块,并将其中的 php 替换为其他扩展名。
  • 不要忘记从锚点(链接)的 href 中也删除扩展名。

非常感谢。这正是我正在寻找的。 - SimplePi
1
@SimplePi 那我建议你接受并标记这个答案,这样这个问题就不会出现在未回答的列表中了。如果你有任何问题,请告诉我,我可以继续帮助你解决。 - Arman P.
1
是的,由于限制,我只是需要等待几分钟才能接受它。 - SimplePi

18

@armanP的以上接受答案并不会从PHP网址中删除 .php扩展名。它只是使得可以在结尾不使用.php的情况下访问PHP文件。例如,/file.php可以使用/file/file.php进行访问,但这将导致您有两个指向同一位置的不同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]

注意:如果您添加了这些规则后,外部样式表或图像未加载,请使用以下方法修复:要解决此问题,您可以使链接变为绝对链接,将 <img src="foo.png> 改为 <img src="/foo.png>。请注意,在文件名前加上 /。或者在 Web 页面的头部添加以下内容将 URI 基本路径更改为 <base href="/">

您的网页无法加载 CSS 和 JS 的原因如下:

当浏览器 URL 从 /file.php 更改为 /file 时,服务器认为 /file 是一个目录,并试图在所有相对路径前添加它。例如:当您的 URL 是 http://example.com/file/ 时,您的相对路径会更改为 <img src "/file/foo.png">,因此该图像无法加载。您可以使用我在最后一段中提到的解决方案之一来解决此问题。


1
谢谢Amit,你的回答解决了我的问题。我正在使用NuxtJS,但.htaccess并没有按照我预期的那样工作。但是你的答案是从URL中删除php和html扩展名的最佳解决方案。所以我的路由器现在完美地工作了。非常感谢。 - Yasin Yörük
请注意,这似乎与常用的“ErrorDocument 404 /404.php”冲突,该命令用于设置自定义404页面。问题在于,404页面现在返回200状态代码,这被解释为软404。要解决此问题,您需要在这两个重写规则之前添加“RewriteCond %{REQUEST_URI} !^/404”作为第一个重写条件,以便这些规则都不会运行404页面。这解决了我上面描述的问题。 - train

0
这是修复内部路径的方法,当删除.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方法也能正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接