如何使用.htaccess隐藏.php URL扩展名?

19

我希望能够在我的.htaccess文件中加入一些内容,以隐藏我的php文件的.php文件扩展名,这样访问www.example.com/dir/somepage将显示www.example.com/dir/somepage.php。

有没有可行的解决方案?如果这很重要,我的网站使用HTTPS。

这是目前我的.htaccess文件内容:

RewriteEngine On

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

ErrorDocument 404 /error/404.php

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) $1\.php [L]
4个回答

52

在DOCUMENT_ROOT下的.htaccess中使用此代码:

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

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

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

需要注意的是,这也会影响所有HTTP请求,包括POST请求,这将导致所有此类请求都遵循重定向,并可能导致这些请求停止工作。

为了解决这个问题,您可以在第一个RewriteRule中添加一个例外,忽略POST请求,使该规则不允许它们。

# To externally redirect /dir/foo.php to /dir/foo excluding POST requests
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=302,L,NE]

2
你如何排除页面?这似乎干扰了我的登录脚本,所以我想从这些重写中排除那个页面。 - ChristopherStrydom
谢谢,我会尝试一下。我认为发生的情况是当页面在没有扩展程序的情况下重新加载时,它会丢失变量。有没有办法解决这个问题?好像它登录了两次... 我想... 一次用电子邮件和密码,另一次没有。所以总体上我无法登录。 - ChristopherStrydom
4
在第一个重定向规则中添加 RewriteCond %{REQUEST_METHOD} !POST 条件,以避免将 POST 请求重定向。 - anubhava
1
@anubhava,你救了我的命。 - Fakhamatia
1
@anubhava 三年后,你也救了我的命。 - Skully
显示剩余3条评论

5

去除php扩展名

您可以在 /.htaccess 文件中使用以下代码:

RewriteEngine on


RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [NC,L]

使用上述代码,您将能够通过/file访问/file.php。
去除html扩展名。
RewriteEngine on


RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_FILENAME}.html [NC,L]

注意:每个htaccess文件顶部只应使用一次'RewriteEngine on'指令,因此如果您想将这两个规则合并,只需从第二个规则中删除该行。您还可以删除任何其他您选择的扩展名,只需在代码中用它们替换'.php'即可。
祝您的htaccess使用愉快!

3
<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f       # if the requested URL is not a file that exists
RewriteCond %{REQUEST_FILENAME} !-d       # and it isn't a directory that exists either
RewriteCond %{REQUEST_FILENAME}\.php  -f  # but when you put ".php" on the end it is a file that exists
RewriteRule ^(.+)$ $1\.php [QSA]          # then serve that file (maintaining the query string)

</IfModule>

奇怪的是,当我在Windows的XAMPP中尝试这段代码时,它给了我HTTP 500错误。删除注释后问题得到解决。将注释移到单独的行上,而不是与指令在同一行上也可以解决问题。


1
@Markum。我后来发现有些实现不喜欢在代码同一行上的注释。尝试删除注释。 - TRiG
遇到了同样的问题 - 删除注释解决了它。 - James Paterson

0

试试这个:

# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ http://example.com/folder/$1 [R=301,L]

# Redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ http://example.com/folder/$1 [R=301,L]

# Resolve .php file for extensionless php urls
RewriteRule ^([^/.]+)$ $1.php [L]Try:

参考资料:

如何在 .htaccess 中隐藏 .php 扩展名


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