使用.htaccess文件去除.php文件扩展名

7
我希望将www.example.com/about.php转换为www.example.com/about。
我创建了一个.htaccess文件并将其放置在服务器的根目录下。我正在使用Linux共享托管,PHP版本为5.2。
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

看起来这段代码应该可以正常工作,但出于某些原因它却不能。当我试图访问没有.php扩展名的页面时,会收到404错误。

以下是我的标记:

<nav>
        <div class="container">
            <ul>
                <li><a href="index.php" <?php if (strpos($_SERVER['PHP_SELF'], 'index.php')) echo 'class="current-nav"';?>>home</a></li>
                <li><a href="about.php">about</a></li>
                <li><a href="services">our services</a></li>
                <li><a href="portfolio" <?php if (strpos($_SERVER['PHP_SELF'], 'portfolio.php')) echo 'class="current-nav"';?>>portfolio</a></li>
                <li><a href="testimonials" <?php if (strpos($_SERVER['PHP_SELF'], 'testimonials.php')) echo 'class="current-nav"';?>>testimonials</a></li>
                <!--<li><a href="#">client area</a></li>-->
                <li><a href="contact" <?php if (strpos($_SERVER['PHP_SELF'], 'contact.php')) echo 'class="current-nav"';?>>Contact</a></li>
                <li><a href="order" <?php if (strpos($_SERVER['PHP_SELF'], 'order.php')) echo 'class="current-nav"';?>><strong>Free Quote</strong></a></li>
            </ul>
        </div>
    </nav><!--/navigation--> 

您可以看到我尝试在链接中使用php扩展名,也尝试了不使用。带有php扩展名的链接会跳转到页面,但不会去掉扩展名。

我进行了一项测试,以查看module_rewrite是否已启用,方法是输入一些垃圾内容并返回500错误。


如果您的主机是共享的,请尝试阅读此文章以完成操作。http://www.kvcodes.com/2016/02/godaddy-remove-php-extension/ - Kvvaradha
我概括了这个问题,因为它似乎与godaddy或php无关。 - Braiam
6个回答

38

使用以下代码来隐藏/删除 .php 扩展名:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

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

## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]

2
这个选项也是我在Godaddy上唯一可用的。感谢@anubhava - Ryan
1
其他解决方案可以使页面在有或没有扩展名的情况下呈现。对于Godaddy,这是唯一的解决方案,无论链接如何都会删除.php扩展名。谢谢。 - E. Marshall
1
谢谢!非常适合Godaddy。 - Michael Brenndoerfer
1
这确实是在GoDaddy上运行的唯一配置! - Jordan
1
更换托管并使用 Plesk Onyx 代替 cPanel 后,我用来隐藏 .php 扩展名的代码停止工作了。我不知道为什么,但是您的代码完全解决了这个问题。 - Dan Bray

7

我经过漫长的谷歌搜索后终于找到了解决方法。这适用于Godaddy共享主机。

它会去掉php文件扩展名,所以http://yoursite.com/about.php变成了http://yoursite.com/about

Options -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f    #If requested is not a filename...
RewriteCond %{REQUEST_FILENAME} !-d    #And not a directory
RewriteRule ^(.*)$ $1.php [L]          # perform this redirect

(上传到服务器之前删除注释)


但这不是正确的解决方案,因为它会将任何 /not-found 文件重写为 /not-found.php,即使该 php 文件在系统中不存在。 - anubhava

5
我也遇到了这个问题,但是我发现以下方法能够解决Godaddy的.htaccess问题。
# Fix Rewrite
Options -Multiviews

# Mod Rewrite
Options +FollowSymLinks
RewriteEngine On
RewriteBase / 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 

太棒了,@John Smith,这对Site5托管也起作用了。 - AdamJones
但我是Godaddy用户,我的是无限托管,但在这里不起作用。 - Kvvaradha

1

在我的 .htaccess 文件中粘贴上面的所有内容对我有效...

## 301 Redirects
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^(.*)\.asp$ $1? [R=301,NE,NC,L]

0

你的重写规则不正确,方向是错误的。请尝试使用以下规则:

RewriteRule ^(.*).php$ /$1 [L,R=301]

谢谢您的输入,但没有运气。仍然收到404错误。 - Adam Pflantzer

0
这对我来说很有效,借助ChatGTP 4的帮助。
Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

# Externally redirect /dir/foo.php to /dir/foo
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=302,L,NE]

# To internally redirect /dir/foo to /dir/foo.php
# The condition checks if the .php version of the filename exists
RewriteCond %{REQUEST_FILENAME}.php -f
# The condition checks that the request is not already for a .php file
RewriteCond %{REQUEST_URI} !\.php$ [NC]
RewriteRule ^ %{REQUEST_URI}.php [L]

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