我原本想让我的所有网址都没有扩展名。不幸的是,我尝试过很多htaccess代码而且我只是放弃了。
所以现在我想这样做,如果一个人想要访问我的网站中的页面,但忘记输入.php,他/她将自动被重定向到相同的网址,但使用.php
如何做到这一点?谢谢!
答案 0 :(得分:4)
以下是规则:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]
它将检查请求的资源是否不是现有文件夹。例如:您请求http://www.example.com/help
。如果存在此类文件夹(/help
),则规则将不执行任何操作(优先级为文件夹)。 如果您不想要此行为,请删除第一行。
在重写之前会检查是否有这样的.php文件。例如:您请求http://www.example.com/aboutus
,但那里没有aboutus.php
个文件 - 不会重写。
所有此类请求都应该没有斜杠:应该是http://www.example.com/aboutus
而不是http://www.example.com/aboutus/
该规则也适用于子文件夹中的网址:例如http://www.example.com/pages/help/aboutus
将被重写。
由于上述检查,规则不会进入重写循环(此规则没有500错误)
将保留查询字符串(页面参数)
答案 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]