如何重定向所有没有扩展名的网址以.php结尾

时间:2011-07-07 02:25:45

标签: .htaccess mod-rewrite

我原本想让我的所有网址都没有扩展名。不幸的是,我尝试过很多htaccess代码而且我只是放弃了。

所以现在我想这样做,如果一个人想要访问我的网站中的页面,但忘记输入.php,他/她将自动被重定向到相同的网址,但使用.php

如何做到这一点?谢谢!

4 个答案:

答案 0 :(得分:4)

以下是规则:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]
  1. 它将检查请求的资源是否不是现有文件夹。例如:您请求http://www.example.com/help。如果存在此类文件夹(/help),则规则将不执行任何操作(优先级为文件夹)。 如果您不想要此行为,请删除第一行。

  2. 在重写之前会检查是否有这样的.php文件。例如:您请求http://www.example.com/aboutus,但那里没有aboutus.php个文件 - 不会重写。

  3. 所有此类请求都应该没有斜杠:应该是http://www.example.com/aboutus而不是http://www.example.com/aboutus/

  4. 该规则也适用于子文件夹中的网址:例如http://www.example.com/pages/help/aboutus将被重写。

  5. 由于上述检查,规则不会进入重写循环(此规则没有500错误)

  6. 将保留查询字符串(页面参数)

答案 1 :(得分:3)

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 :(得分:1)

在回复Sun Love时,您发布的代码效果很好,除非您有没有文件扩展名的尾部斜杠(我得到500错误),因为第一个RegEx并不匹配这种情况。 / p>

  

example.com/test.html - 工作(重定向到/ test)

     

example.com/test - 有效(无重定向)

     

example.com/test.html - 工作(重定向到/ test)

     

example.com/test/ - 不起作用(500错误)

可能有更好的方法可以做到这一点,但我添加了另一个重写条件来解决这个问题:

RewriteEngine on
Options +FollowSymLinks -MultiViews
RewriteBase /

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

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)/\s
RewriteRule ^ %1 [R=301,L]

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

答案 3 :(得分:0)

试试这个.htaccess:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteRule ^([^\.]+)$ $1.php [L]

编辑:^([^\.]+)$ $1.php [L]