.htaccess重写规则防止无限循环

时间:2010-06-24 22:58:55

标签: regex apache .htaccess mod-rewrite apache2

我有一个名为 dollar 的目录,其中包含一个文件 index.php 。我想将网址 http://localhost/dollars/foo 转换为 dollar / index.php?dollar = foo 。这是我目前在美元 directorty中的.htaccess文件:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !^index\.php
RewriteRule ^(.+)$ index.php?dollars=$1 [L]

除了对 index.php 的请求之外的任何请求都应该使用RewriteRule。

然而,这不起作用。

我一直在寻找如何创建我想要的重定向,但我甚至不知道我是否在正确的轨道上。正则表达式从来都不是我的事。谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

经常使用的重写解决方案是检查所请求的路径是否指向实际的文件/目录,如果没有则重写它 - 因为重写的URL将指向实际的文件,没有发生循环。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

答案 1 :(得分:1)

Amber的答案应该让事情适合你,但我想解决你的具体情况出了什么问题。你有正确的想法,但%{REQUEST_FILENAME}实际上最终成为一个完全限定的路径,所以你的正则表达式应该在结尾检查index.php,而不是开头。

因此,你会发现这会更像你期望的那样:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !index\.php$
RewriteRule ^(.+)$ index.php?dollars=$1

如果您在该目录中添加了其他内容,那么将Amber所提到的那些RewriteCond换掉就不会有问题了,所以我建议不要使用它代替这个。