2013-01-21 66 views
2

我期待在我的.htaccess文件来设置规则,以便以.php扩展名的文件都可以通过只用一个斜线替换扩展访问(/foo/bar/将静默加载/foo/bar.php)。以前,我发现this,这是我正在寻找的一种,除了它只改变/foo/bar.php/foo/bar(注意没有结束斜线)。的.htaccess重写/富/酒吧/到/foo/bar.php

对于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

每下面的意见,目的是让用户可见的网址一样/富/酒吧/实际运行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]在第一规则的端部指定而不是重定向重写,从而使用户负载/富/酒吧/。第二条规则末尾的$1与括号(终止斜杠前的所有内容)匹配,然后在最后加上.php。 [L]意味着停止评估RewriteRules

正如我在原来的答复中,对于使用字符串替换领先斜线的依赖于​​上下文。有了这些规则,您将能够看到第一条规则的效果,因为它是重定向。如果重定向尝试去mydomain.comfoo/bar/而不是mydomain.com/foo/bar/,则在每个规则中的$1之前添加一个前导斜杠。

另一个说明 - 你的PHP脚本期望任何查询字符串?如果有的话,可能需要进行额外的调整。

Apache mod_rewrite reference有更多的细节。

+0

这只是'404 Not Found'错误到处都是。 – Charles

+0

对不起,''RewriteRule ^(。*)\。php $/$ 1 /'产生相同的结果。仍然只在每个页面上显示404 Not Found。 – Charles

+1

你太快了......当我编辑第二个选项时,你测试了它。 :-)但是,为了确保你明白,你要求的是将'/ foo/bar.php'重写为'/ foo/bar /'。这并不意味着你只是隐藏了用户的“.php”部分,这意味着Apache实际上会尝试加载'/ foo/bar /'。如果你真的想运行bar.php脚本,但用户只看到bar /,那是另一个问题。 –

1

最后,我用下面的代码,我原来的裁断和大卫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]