.htaccess rewrite / foo / bar / to /foo/bar.php

时间:2013-01-21 03:54:02

标签: apache .htaccess mod-rewrite

我正在寻找在.htaccess文件中设置规则,以便可以通过用斜杠替换扩展名来访问扩展名为.php的所有文件(/foo/bar/将静默加载/foo/bar.php) 。以前,我找到了this,这是我正在寻找的,除了它只会将/foo/bar.php更改为/foo/bar(注意没有结束斜杠)。

对于htaccess来说,我几乎是一个完全新手,并且使用前一个链接的代码进行大约30分钟的调整并没有产生大量的500 internal server error s。我确信这是一个如此简单的解决方案,但Google和试验都没有给我带来任何结果。

有人可以查看上述帖子中的代码(下面复制)并进行更改,以便/foo/bar/重写为/foo/bar.php吗?

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 个答案:

答案 0 :(得分:2)

根据下面的评论,目的是让用户可见的网址如/ foo / bar /实际运行像/foo/bar.php这样的php脚本。此外,您可能希望尝试直接加载/foo/bar.php的用户被重定向到/ foo / bar /以保持一致。

#Redirect users loading /foo/bar.php to /foo/bar/
RewriteRule ^(.*)\.php$ $1/ [R]

#Rewrite /foo/bar/ (what the user sees) silently to /foo/bar.php
RewriteRule ^(.*)/$ $1.php [L]

第一个规则末尾的[R]指定重定向而不是重写,以便用户加载/ foo / bar /。第二个规则末尾的$1与括号(终止斜杠之前的所有内容)匹配,然后在末尾添加.php。 [L]表示停止评估RewriteRules

与我原来的回复一样,替换字符串使用前导斜杠取决于上下文。使用这些规则,您将能够看到第一条规则的效果,因为它是重定向。如果重定向尝试转到mydomain.comfoo/bar/而不是mydomain.com/foo/bar/,则在每个规则中的$1之前添加前导斜杠。

另一个注意事项 - 您的PHP脚本是否需要任何查询字符串?如果有的话,可能需要进行额外的调整。

Apache mod_rewrite reference有更多详情。

答案 1 :(得分:1)

最终我使用以下代码完成了这项工作,结合了我最初的发现和David Ravetti的帮助。

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
RewriteRule ^(.*)/$ $1.php [L]