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



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

当涉及到htaccess的时候,我几乎是一个完全的新手,大约30分钟的时间来调整前一个链接的代码,没有产生大量的500 internal server error s。我相信这是一个很简单的解决办法,但无论是谷歌还是试错法都没有给我带来任何结果。

有没有人可以看看前面提到的帖子(复制在下面)的代码,并改变它,使/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]

多谢!

根据下面的注释,目的是有用户可见的url,如/foo/bar/,实际运行php脚本,如/foo/bar.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参考有更多细节

最终,我使用以下代码使其工作,这是我最初的发现和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]

最新更新