2010-06-24 64 views
1

我有一个目录名为美元其中包含一个文件index.php。我想要的网址http://localhost/dollars/foo转换为dollars/index.php?dollars = foo。这是我现在有在美元 directorty .htaccess文件:.htaccess重写防止无限循环的规则

Options +FollowSymLinks 
RewriteEngine On 

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

的想法是不是的index.php的请求之外的任何请求,应使用重写规则。

但是,这不起作用。

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

回答

3

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

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

这正是我所需要的。完善!非常感谢。 但是,我对以下问题有些困惑,尽管它并没有真正影响我。 url localhost/dollars/index重定向到index.php,而不传递'index'作为$ 1参数。为什么是这样? 再次感谢! – apeace 2010-06-25 16:34:25

1

琥珀的回答应该让你的工作有效,但我想解决你的具体情况出了什么问题。你有正确的想法,但%{REQUEST_FILENAME}实际上最终是一个完全合格的路径,所以你的正则表达式应该在最后检查index.php,而不是开始。

因此,你会发现,这会更像你期待:

RewriteEngine On 

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

对于那些琥珀提到如果添加其他东西到该目录,虽然会少些问题交换了RewriteCond S,所以我建议使用它来代替这个。

+0

非常感谢!我明白我做错了什么。尽管如此,我更喜欢琥珀的解决方案,因为它更清洁一些。另外,我问琥珀的问题也适用于此解决方案,原因我不明白。思考? – apeace 2010-06-25 16:35:36

+0

我想,您必须为该目录启用MultiView。 尝试将'Options -MutliViews'添加到'.htaccess'文件中并查看它是否正确运行。 – 2010-06-25 17:11:16

+0

完全正确的家伙。有一天我会读一本关于这个的书... 再次感谢! – apeace 2010-06-25 19:37:12