使用mod_rewrite删除.php扩展名

Jam*_*mes 42 apache mod-rewrite

我想要一个mod_rewrite规则集,所以我可以引用一个没有.php扩展名的页面,但是要重写它以包含php扩展.这将在1&1服务器上运行.

有没有好的参考资料,所以我可以自己学习更多?

Dan*_*man 57

RewriteEngine On
RewriteRule something something.php [L]
Run Code Online (Sandbox Code Playgroud)

http://example.com/something 将被处理,就好像它是一个请求 something.php

要将所有非物理文件的请求重定向到同名但使用.php:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.*) $1.php [L]
Run Code Online (Sandbox Code Playgroud)

  • 很抱歉评论这么老的答案,但对于那些后来发现的人:我发现虽然Dan的第二个例子(重定向所有请求)运行良好,但它可以防止无效URL上的任何404 Not Found错误(如果没有'某事' .php`,`http:// example.com/something`不会返回404,它将返回500内部服务器错误).为了解决这个问题,我添加了第三个RewriteCond:`RewriteCond%{REQUEST_FILENAME} .php -f`,如果实际上存在匹配的php文件,它将只允许重写. (22认同)
  • 这可能是一个迟到的评论,但我经常看到这个答案的链接,在我看来,答案并不完全正确.¿当传入的URl是`http:// example.com/something /`时会发生什么?带有斜线.替换URL将是`http:// example.com/something/.php`,这不起作用.错误发生在正在传递所有内容的正则表达式组(.*)中,包括斜杠. (3认同)
  • Filipe 的评论很重要,答案并没有正确处理这种情况。它导致 Apache 递归地尝试将请求发送到 /something/.php.php.php.php.php.php.php.php.php.php.php 并以“请求超出了 10 个内部重定向的限制”而停止到可能的配置错误。” 浪费计算资源。 (2认同)

sta*_*een 14

上面接受的答案不会.php从网址中删除扩展名,它只允许您访问 .php没有扩展名的文件.要从.php网址中完全删除扩展程序,您可以在以下位置使用以下规则root/.htaccess:

RewriteEngine on

#1)externally redirect "/file.php" to "/file"   
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
#2)Internally map "/file" back to "/file.php"
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,L]
Run Code Online (Sandbox Code Playgroud)