【问题标题】:.htaccess rewrite rule preventing infinite loop.htaccess 重写规则防止无限循环
【发布时间】:2011-03-08 01:40:04
【问题描述】:

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

Options +FollowSymLinks
RewriteEngine On

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

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

但是,这不起作用。

我一直在寻找一段时间,试图弄清楚如何创建我想要的重定向,但我什至不知道我是否走在正确的轨道上。正则表达式从来都不是我的事。感谢您的帮助!

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite apache2


    【解决方案1】:

    Amber 的回答应该对您有用,但我想解决您的具体情况下出了什么问题。您的想法是正确的,但 %{REQUEST_FILENAME} 实际上最终会成为此处的完全限定路径,因此您的正则表达式应该在末尾而不是开头检查 index.php

    因此,您应该会发现这将更符合您的预期:

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

    不过,如果您在该目录中添加其他内容,则将 RewriteConds 替换为 Amber 提到的那些问题会更小,因此我还是建议使用它来代替它。

    【讨论】:

    • 非常感谢!我明白我做错了什么。不过,我更喜欢 Amber 的解决方案,因为它更干净一些。另外,我问 Amber 的问题也适用于这个解决方案,原因我不明白。想法?
    • 我认为您必须为该目录打开 MultiViews。尝试将Options -MutliViews 添加到该.htaccess 文件中,看看它的行为是否正确。
    • 完全正确,伙计。有一天我会读一本关于这方面的书......再次感谢!
    【解决方案2】:

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

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

    【讨论】:

    • 这正是我所需要的。完美的!太感谢了。但是,我对以下问题有点困惑,尽管它并没有真正影响到我。 url localhost/dollars/index 重定向到 index.php,而不传递 'index' 作为 $1 参数。为什么是这样?再次感谢!
    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    相关资源
    最近更新 更多