使用 htaccess 将所有内容重定向到 index.php

2023-12-11

我正在编写一个简单的基于 PHP 的 MVC 框架。我希望这个框架能够安装在任何目录中。

我的 PHP 脚本获取请求 uri 并将其分成多个段。它使段 1 成为控制器,使段 2 成为动作。当我这样做时一切都很好:

http://www.example.com/mvc/module/test/

它将转到特定的模块控制器和方法。现在我有一个默认控制器,即 home 控制器,位于 home 文件夹中。

现在当我直接访问这个文件夹时http://www.example.com/mvc/home/它将显示一个403 forbidden,因为这个文件夹确实存在,所以它也应该返回到http://www.example.com/mvc/index.php

如果我将框架安装在不同的文件夹中,假设文件夹框架必须重定向回http://www.example.com/framework/index.php

我想将每个文件夹和 php 文件重定向回 index.php,其他一切保持原样。

我遇到的第一个问题是它永远不会重定向到正确的文件夹,总是重定向到域根文件夹。

这是我尝试过的:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

你的重写规则看起来几乎没问题。

首先确保您的.htaccess文件位于您的文档根目录中(与index.php)或者它只会影响它所在的​​子文件夹(以及其中的任何子文件夹 - 递归地)。

接下来对您的规则稍作更改,使其看起来像这样:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

此刻你刚刚匹配.这是one任何字符的实例,你至少需要.*匹配任何字符的任意数量的实例。

The $_GET['path']变量将包含假目录结构,所以/mvc/module/test例如,您可以在 index.php 中使用它来确定控制器以及您想要执行的操作。


如果你想将整个shebang安装在一个子目录中,例如/mvc/ or /framework/最简单的方法是稍微改变重写规则以考虑到这一点。

RewriteRule ^(.*)$ /mvc/index.php?path=$1 [NC,L,QSA]

并确保您的index.php位于该文件夹中,同时.htaccess文件位于文档根目录中。


替代$_GET['path'](更新于 2018 年 2 月和 19 年 1 月)

实际上没有必要(现在甚至不常见)设置path as a $_GET变量,许多框架都会依赖$_SERVER['REQUEST_URI']检索相同的信息 - 通常是为了确定哪个控制器使用——但原理是完全一样的。

这确实简化了RewriteRule稍微因为你不需要创建path参数(这意味着OP的原始RewriteRule will现在工作):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]

However,有关安装在子目录中的规则仍然适用,例如

RewriteRule ^.*$ /mvc/index.php [L,QSA]

标志:

NC= 不区分大小写(不区分大小写,并不是真正必要,因为模式中没有字符)

L= 最后(它将在此重写之后停止重写,因此请确保它是重写列表中的最后一件事)

QSA= 查询字符串追加,以防万一你有类似的东西?like=penguins在您想要保留并传递给index.php 的末尾。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 htaccess 将所有内容重定向到 index.php 的相关文章

随机推荐

  • Bash - 当新行出现时只转到下一个索引,而不是空格?

    我正在使用名为 jq 的工具解析 JSON 响应 jq 的输出将在命令行中提供全名列表 我有变量getNames其中包含 JSON 例如 count 49 user username jamesbrown name James Brown
  • 根据 pandas 列中的列表值从 DataFrame 中选择行

    我是 pandas 的新手 我有一个简单的数据框 想要根据列提取某些行 然而 此列中的类型是列表 Example df pd DataFrame text1 1 2 3 text2 2 3 4 columns text list value
  • rake asset:precompile 和 RAILS_ENV=生产 rake asset:precompile 之间有什么区别?

    这两个任务有什么区别 为什么我需要在 cap 部署时添加 RAILS ENV production thanks 您需要指定RAILS ENV production环境变量 以便您的config environments productio
  • N2965 - std::bases 和 std::direct_bases 的状态是什么?

    我正在编写一个模板 它确实需要了解其参数类型的所有基类 这std bases提出的特质N2965非常适合此目的 但是我找不到有关其状态的任何可靠信息 这个提案还有效吗 如果是这样 我们什么时候可能会看到它标准化 如果没有 是否还有其他提案可
  • spect.currentframe() 在某些实现下可能不起作用?

    根据docs inspect currentframe 返回调用者堆栈的框架对象 框架 CPython实现细节 该函数依赖于Python堆栈 解释器中的框架支持 不保证存在于 Python 的所有实现 如果在没有的实现中运行 Python
  • 未为内部服务器错误响应 ASP.NET Core 3.1 设置 CORS 标头

    这是我的 CORS 配置 services AddCors options gt options AddPolicy name AllowedOrigins policyBuilder gt var urls Configuration G
  • 选择大于某个值的列

    我的问题看起来很简单 但我查了很多答案 但没有找到合适的答案 所以我有一个小数据 如下所示 我希望 count 36 只查找包含大于 36 的列 我的代码如下 count 36 lt df which df 1 19 gt 36 数据如下所
  • Tkinter 树视图选择

    from Tkinter import from ttk import import tkMessageBox class Application Frame def selected self curItem self tree focu
  • 修改 bash 脚本中的 $READLINE_LINE 和 $READLINE_POINT 值

    接听时这个问题我用了一个非常凌乱的bind函数根据 my 的结果修改当前行automplete sh script 当我最终将此脚本用于个人用途时 我尝试简化bind并尝试直接在脚本内进行所有读取和修改 到目前为止 我可以访问 READLI
  • WP7 - 列表框绑定

    我有一个 ObservableCollection 我想将其绑定到我的列表框 lbRosterList ItemsSource App ViewModel rosterItemsCollection 但是 在该集合中我还有另一个集合 Dat
  • [[: 找不到命令

    我正在没有 sudo 权限的系统上安装 RVM 理论上它应该工作得很好 但是当我添加时 s HOME rvm scripts rvm source HOME rvm scripts rvm 到 bash profile 它没有做它应该做的事
  • 检查项目后会触发哪个 CheckedListBox 事件?

    我有一个 CheckedListBox 我想要一个事件after检查一个项目 以便我可以将 CheckedItems 与新状态一起使用 由于 ItemChecked 在 CheckedItems 更新之前被触发 因此它无法开箱即用 当 Ch
  • 替换功能不替换[重复]

    这个问题在这里已经有答案了 我按照一些文档使用 JavaScript 替换函数 但它没有改变任何内容 不会抛出任何错误 知道我做错了什么吗 该变量是从 XML 中检索的 也许需要将其转换为字符串或其他内容 for var i 0 iln p
  • 通过 jQuery 在 YouTube 嵌入电影中启用自动播放

    我使用以下代码嵌入 YouTube 电影 正如您在 src 属性中看到的 有一个变量 autoplay 0 我在 jQuery 中编写了两行脚本 应将 autoplay 变量设置为 1 var title iframe ytplayer a
  • 在VBA中处理大数

    如何在VBA中处理10E22这样的非常大的数字 dim a b c as double a 1234567890123456789012 c a bit b a c 1 bit 我得到 b 0 按照建议 我改变dim a as double
  • 这是 JSON.NET 或实体框架中的错误,还是我在尝试使用 JSON.NET 序列化异常列表时做错了什么?

    尝试序列化一组错误时出现此错误 ISerialized 类型 System Data Entity Infrastruct DbUpdateConcurrencyException 没有有效的构造函数 要正确实现 ISerialized 应
  • 调用 getBluetoothService() 时没有使用 BluetoothManagerCallback

    我是安卓开发新手 我正在编写一个应用程序 它从笔记本电脑的蓝牙终端接收字符串 打开连接时 执行以下行时 我收到错误 连接被拒绝 socket connect 我尝试检查 connect 方法中发生了什么 在这里我发现 Android Stu
  • 替换为 preg_replace 中的动态变量

    我陷入了这个问题 即 我有一个像这样的数组 array name gt John email gt email protected 和这样的字符串样本 string Hi name your email is email 问题很明显 将名称
  • 无法使用接口默认方法

    我已经安装了新版本的 Visual Studio 并将项目设置为 C 8 当我尝试使用如下所示的新界面功能时 它说我无法在界面中实现 这似乎不知何故我无法使用新功能 谁能解释一下为什么 它仍然没有包含在 2019 年预览中吗 interfa
  • 使用 htaccess 将所有内容重定向到 index.php

    我正在编写一个简单的基于 PHP 的 MVC 框架 我希望这个框架能够安装在任何目录中 我的 PHP 脚本获取请求 uri 并将其分成多个段 它使段 1 成为控制器 使段 2 成为动作 当我这样做时一切都很好 http www exampl