2

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

当谈到 htaccess 时,我几乎是一个全新的新手,大约 30 分钟的时间调整了上一个链接中的代码,并没有产生大量的500 internal server errors。我确信这是一个如此简单的修复,但无论是谷歌还是反复试验都没有给我带来任何结果。

任何人都可以查看上述帖子中的代码(复制如下)并更改它以便/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]

非常感谢!

4

2 回答 2

2

根据下面的评论,目的是让用户可见的 URL 像 /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 参考有更多细节。

于 2013-01-21T05:08:27.207 回答
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]
于 2013-01-21T15:13:29.407 回答