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

40

可能是重复问题:
如何使用 .htaccess 删除 .php 文件扩展名

我试图隐藏掉 .php 文件的扩展名,但不知道为什么一直无法实现。我最新的尝试是:

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule ^folder/([a-zA-Z_\-0-9]+)/?$ /folder/$1.php
</IfModule>

我已经尝试了很多从网上找到的不同代码变体,但仍然没有运气。 .htaccess 文件放置在根目录中。


看起来对我来说没问题(除了你可能想忽略尾部斜杠)。你确定你的主机允许使用htaccess文件并且支持mod_rewrite吗? - Tom van der Woerdt
你是因为美观或安全原因隐藏扩展名吗?如果是后者,那么人们可以通过其他方式发现网站正在使用的脚本语言。例如:http://www.ashleysark.com/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 - djdy
如果我点击链接并删除 .php 结尾,则对我来说运行正常。 - Dan
3个回答

96

我使用了这个:

RewriteEngine On

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

另请参见:此问题


1
谢谢你,ryanve。太棒了! - Vinit Kadkol
1
这在Windows系统上运行良好,但无法在我的Ubuntu 13.04上重写。 你有什么解决方案吗?提前感谢! - Vinit Kadkol
谢谢您的回答。但是我无法使第二个URL段成为可能,例如,如果我的URL是www.abc.com/xyz/somthing,那么它将无法加载页面,但使用www.abc.com/abc时它将正常工作。 - M K Garwa
5
在这里,你可以将 http://example.com/folder/$1 替换为 http://%{HTTP_HOST}/folder/$1 - Danny Beckett
1
我的链接从 http://192.168.1.2/blisscount/user/about.php 被重定向到了 http://192.168.1.2/blisscount/user/about,但现在我收到了一个 404 错误 - ChristopherStrydom
显示剩余7条评论

15

使用无扩展名的PHP脚本的另一种选项是

Options +MultiViews

甚至只需在目录中遵循.htaccess文件:

DefaultType application/x-httpd-php

后者允许所有没有扩展名的文件名 script 被视为 PHP 脚本。虽然 MultiViews 会在提供基本名称时寻找替代方案,但这会造成性能影响。


很可能是为什么评论中的丹能够在不使用扩展名的情况下使其工作。好答案。 - typeoneerror
1
第一种解决方案对我有用。我已将其添加到根目录的.htaccess文件中,使用WordPress。我的脚本正在重定向(.php扩展名被隐藏且不需要)。 - mrarm

9

1) 你确定 mod_rewrite 模块已启用吗?请检查 phpinfo()

2) 你上面的规则假设URL以“folder”开头。这正确吗?你实际上想在URL中有“folder”吗?这将匹配类似这样的URL:

/folder/thing -> /folder/thing.php

如果您真的想要...
/thing -> /folder/thing.php

你需要从匹配表达式中删除文件夹。通常我使用这种方法将请求路由到没有PHP的页面(但你的应该可以工作,这让我想到可能未启用mod_rewrite)。
RewriteRule ^([^/\.]+)/?$ $1.php  [L,QSA]

3)假设您在.htaccess文件中声明规则,那么您的安装是否允许在.htaccess文件中设置Options(AllowOverride)覆盖?一些共享主机不允许。

当服务器找到一个.htaccess文件时(如AccessFileName所指定),它需要知道该文件中声明的哪些指令可以覆盖较早的访问信息。


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