使用 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 的相关文章

  • 连接到 mysql 服务器(localhost)非常慢

    实际上有点复杂 摘要 与数据库的连接非常慢 页面渲染大约需要 10 秒 但页面上的最后一条语句是一个回显 当页面在 Firefox 中加载时我可以看到它的输出 IE 是相同的 在谷歌浏览器中 只有在加载完成后输出才可见 不同浏览器的加载时间
  • $1 [QSA,L] 在我的 .htaccess 文件中意味着什么?

    我需要改变我的 htaccess有两行我不明白 RewriteCond REQUEST FILENAME l RewriteRule index php url 1 QSA L 我什么时候应该使用这些线 不是提供完整教程的地方 但这里是简短
  • 强制 mod_rewrite 的 RewriteRule 替换的 URL 路径

    使用 mod rewrite 执行重写时RewriteRule 根据替换的根目录是否存在于文件系统上 评估替换并猜测它是 URL 还是文件系统路径 这是相关部分文档 https httpd apache org docs 2 4 mod m
  • Apache 配置:正则表达式禁止访问以点开头的文件/目录

    我想禁用对其名称以点开头的任何文件或目录的访问 我想出了以下方法 但只有当它们直接位于文档根目录中时 它才会禁用对以 DOT 开头的文件 目录的访问
  • 使 .git 目录 web 不可访问

    我有一个网站 我使用 github 闭源 来跟踪更改和更新网站 唯一的问题是 git 目录似乎可以通过网络访问 我怎样才能停止这个并且仍然能够使用 git 我应该使用 htaccess 吗 我应该更改 git 的权限吗 把这个放在一个 ht
  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • mod_rewrite 将 '_' 替换为 '-'

    我几乎已经有了 mod rewrite 规则 但我已经屈服了 我需要重写 country countryname php to country countryname 但是 国家 地区名称 可能有这样的下划线 south africa ph
  • 通过 HTTPS 的隧道

    在我的工作场所 流量拦截器 防火墙变得越来越糟糕 我无法通过端口 22 连接到我的家用计算机 并且缺乏 ssh 访问权限让我感到难过 我以前可以通过将 SSH 移动到端口 5050 来使用它 但我认为最近的一些过滤器现在将此流量视为 IM
  • IfModule:什么时候需要指定它?

    您是否需要将重写规则包含在以下内容中
  • 无法在 Netbeans 9 中设置 apache tomcat

    我正在尝试在 Netbeans IDE 9 中设置 apache tomcat 我已尝试以下步骤 但无法设置 在 工具 gt 服务器 中 我单击 添加服务器 按钮 显示以下消息 因此 我尝试从 工具 gt 插件 安装插件 会显示一个对话框
  • 从 Laravel 的 URL 中删除 index.php

    我正在 Linux Mint 中使用 Laravel 5 5 12 我正在使用 LAMP 堆栈 我想删除index php来自网址 我的mod rewrite已启用阿帕奇模块 My htaccess文件位于public文件夹 它包含以下代码
  • Apache 重写 - 获取 PHP 中的原始 URL

    我在 nginx 或 Apache 中重写了这个地址 http domain com hello 到像这样的脚本 http domain com test php ref hell 如何在 PHP 中访问这个重写的 URL 因为 如果我使用
  • 在 Apache 服务器上将特定的 .htm 页面处理为 .php [重复]

    这个问题在这里已经有答案了 我正在为 Apache 服务器编程 并且只需要将一个特定的 html 页面 例如 first htm 作为 PHP 脚本进行处理 可以设置吗 SetHandler http httpd apache org do
  • 如何调试apache虚拟主机配置?

    我的 apache 虚拟主机配置再次出现问题 使用默认配置而不是我的特定配置 问题不在于配置错误 而在于如何解决它 有人有好的建议可以快速解决此类问题吗 更多信息 默认的conf文件是这样的 NameVirtualHost
  • 尝试在 Apache 上运行乘客时出现问题

    我在运行时遇到这个问题 httpd t httpd Syntax error on line 545 of private etc apache2 httpd conf Syntax error on line 1 of private e
  • 项目链接在 Wamp 服务器上不起作用

    我正在另一台计算机上安装 Wamp 服务器来运行中型数据库和 UI 我已成功阻止 IIS 并将服务器路由到 Localhost 8080 但是每当我尝试从 localhost 主页访问我的项目时 在 www 文件中 我被重定向到页面未找到错
  • 并行读取 Flume spoolDir

    由于我不允许在产品服务器上设置 Flume 因此我必须下载日志 将它们放入 Flume spoolDir 中 并有一个接收器从通道中使用并写入 Cassandra 一切正常 但是 由于 spoolDir 中有很多日志文件 并且当前设置一次仅
  • mod_rewrite代理超时

    我有 apache 设置来代理对后端应用程序服务器的请求 有多个后端服务器 并且有一个大的 rewrite rules 文件 针对每个请求进行处理 以正确地将所有请求代理到应用程序服务器 一台特定的应用程序服务器有时需要很长时间才能响应 如
  • 是否可以在httpd.conf中使用变量

    有没有办法useapache httpd conf 文件中的某种变量 我想定义一个值并在整个块中使用它 如 define myvar somename or whatever the syntax would be alias my pat
  • 如何将路径添加到 Apache PATH 变量?

    我在 apache2 的 custom conf 文件中设置了以下内容 SetEnv PATH PATH opt local lib mysql5 bin this is a test 但是它不起作用 当我打电话时 hey shell ex

随机推荐

  • 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