【问题标题】:htaccess rewriting all requests to a single controllerhtaccess 将所有请求重写到单个控制器
【发布时间】:2010-09-23 08:51:54
【问题描述】:

以与 codeigniter 类似的方式,我想捕获所有请求并将它们重写为 index.php 文件,该文件位于我的 Web 可访问文件夹的根目录中。与 codeigniter 上的示例不同,但我不想在重写之前检查文件是否存在(因为我不想允许直接访问任何文件)。

我使用以下重写规则取得了部分成功:

RewriteRule ^(.*)$ index.php/$1/ [L]

但是,我可以让它工作的唯一方法是在它之前添加一个重写条件,它会进行某种检查以确保请求不是针对 index.php,否则我会收到 500 内部服务器错误。我查看了错误日志,似乎是由于递归过多。我知道,如果请求 index.php 无论如何都没有关系,因为它们会命中正确的文件,但我不明白这种情况的必要性,而且当我不知道为什么它必须存在时,我觉得包括它很脏?

工作规则是……

RewriteCond %{REQUEST_URI} !^/index.php/

还值得一提的是,这种重写条件也很有效,但我不知道为什么需要它!

RewriteCond %{REQUEST_FILENAME} !index.php

【问题讨论】:

    标签: php .htaccess


    【解决方案1】:

    RewriteCond 表示,仅在满足这些条件时才评估以下 RewriteRule。 在您的情况下,用“如果请求的 URI 以 /index.php 开头,则重新路由到 index.php”的话来说。

    您需要该检查,否则您将在无限循环中将 index.php 重新路由到自身。

    【讨论】:

    • 无限循环部分真的让我很困惑,我知道我会将 index.php 重写为 index.php 一次,但我不明白为什么它会尝试第二次(或第三次)或第四……)时间。我想我可能在这里遗漏了一些重要的东西......
    • 它评估每个请求的 RewriteRule。因此,在将您的初始请求发送到 index.php 之后,对 index.php 的请求也会被评估,再次,重新路由到 index.php.. 等等。
    • 为其他感兴趣的人找到了有关递归的更多信息...wiki.apache.org/httpd/RewriteLooping
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2013-06-14
    • 2016-11-30
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    相关资源
    最近更新 更多