如何在浏览器状态栏中隐藏.php链接中的扩展名



我正在使用.htaccess文件来隐藏URL中的.php扩展名。虽然它工作正常,但现在我还必须在页面上显示的所有链接中隐藏.php文件扩展名。

例如,当我将鼠标悬停在链接上时,其 URL 显示状态栏并包含.php扩展名。 如何从链接URL中删除.php或完全隐藏浏览器状态栏中的URL?

我在我的 .htaccess 文件中使用以下代码:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
## don't touch /forum URIs
RewriteRule ^forums/ - [L,NC]
## hide .php extension snippet
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}s([^.]+).php [NC]
RewriteRule ^ %1 [R,L]
# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]
# To remove www header
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]

(代码最初基于anubhava的这个答案。

我的HTML文件中的链接看起来像menu1.phpmenu2.php等。当我单击这些链接时,浏览器 URL 栏中显示的 URL 看起来像domain.com/menu1,这很好。但是在状态栏中,当我将鼠标悬停在这些链接上时,它仍然显示menu1.php.

如何在状态栏中隐藏该.php后缀?我是否必须手动更改所有链接中的所有URL,或者有某种方法可以隐藏它们?

简短回答:是的,您确实需要编辑所有链接才能从中删除.php扩展名。


您引用的.htaccess文件包含两个(相关(部分,它们执行不同的操作:

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

当用户的浏览器请求具有.php扩展名的 URL 时,将触发此重写规则。 该规则会导致 Web 服务器通过外部重定向到同一 URL 进行响应,但删除.php后缀。 然后,浏览器将重试使用新 URL 加载页面,并且还将在地址栏中显示该新 URL。

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

然后,第二个 RewriteRule 会在不包含.php扩展名的 URL 上触发,但如果扩展名附加到它们,这些 URL 将与 Web 服务器上的实际.php文件相对应。 然后,该规则将.php扩展名追加回 URL 并重试请求 - 但它会在内部在您的网络服务器内部执行此操作,而浏览器根本不知道更改。

因此,实际上,浏览器被告知显示没有.php扩展名的URL,但Web服务器最终仍然运行带有扩展名的PHP脚本。

但是,所有这些仅在用户单击链接发生。 .htaccess 文件中的 URL 重写规则不会也不能神奇地编辑您的 HTML 代码以修复其中包含的 URL。 因此,要实际隐藏您正在使用 PHP 的事实,您需要手动编辑您的 HTML(包括您的 PHP 脚本本身输出的任何 HTML 代码(以从 URL 中删除.php文件扩展名。

(作为副作用,这样做也使上面引用的第一个重写规则变得不必要。 但是,您可能仍希望保留它,以便 URL 中仍包含.php扩展名的任何旧链接仍会自动重定向。

最新更新