使用 .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 中删除php
和 html
扩展,你可以试试这个链接 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]
注意:如果您的外部样式表或图像
添加这些规则后未加载,要解决此问题,您可以将链接绝对更改为 <img src="foo.png>
至 <img src="/foo.png>
。注意文件名前的 /
。或更改 URI 基础,将以下内容添加到网页的 head 部分 <base href="/">
。
由于以下原因,您的网页无法加载 css 和 js:
当您的浏览器 url 从 /file.php
更改为 /file
时,服务器认为 /file
是一个目录,并尝试将其附加到所有相对路径的前面。例如:当您的 url 是 http://example.com/file/
您的相对路径更改为 <img src "/file/foo.png">
因此图像无法加载。您可以使用我在上一段中提到的解决方案之一来解决此问题。
【讨论】:
谢谢阿米特,你的回答解决了我的问题。我正在使用 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 扩展名的主要内容,如果未能解决你的问题,请参考以下文章