特定文件的 mod_rewrite 异常

2023-12-20

我的页面没有按应有的方式重定向,因为我的 .htaccess 文件设置为:

RewriteEngine on  
RewriteCond $1 !^(index\.php|resources|robots\.txt)  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteRule ^(.*)$ index.php/$1 [L,QSA]   

我将这个设置用于我的 MVC 框架,所以我得到像这样的 url/controller/method/argument然而,当我重定向到/forum/login.php时,它会切换到/forum/。

我怎样才能将其添加为例外,以便我能够重定向到/forum/login.php

我在 /forum/ 目录中发现了另一个 .htaccess 这是否也会导致问题?

# BEGIN PunBB

<IfModule mod_rewrite.c>
    # MultiViews interfers with proper rewriting
    Options -MultiViews

    RewriteEngine On

    # Uncomment and properly set the RewriteBase if the rewrite rules are not working properly
    #RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . rewrite.php [L]
</IfModule>

首先我会告诉你如何阅读你的 RewriteRule:

您从第一个(或下一个)RewriteRule 条目开始:

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

第一个参数是一个正则表达式,可以匹配您请求的 URL。^(.*)$匹配所有内容,并将此“所有内容”存储在稍后可以使用的变量中。

仅当存在前面的 RewriteCond 条目时,接下来才会对它们进行评估:

RewriteCond $1 !^(index\.php|resources|robots\.txt)

$1是对 RewriteRule 第一个括号内匹配的内容的引用。这与第二个参数进行比较,第二个参数是一个正则表达式,声明了几个显式名称,并且!否定表达式,例如仅当正则表达式不匹配时,此规则才允许执行 RewriteRule。如果此条件返回 true,则将查看下一个条件。

RewriteCond %{REQUEST_FILENAME} !-f

如果请求的文件名不是硬盘上的真实文件,则此条件为真。

RewriteCond %{REQUEST_FILENAME} !-d

如果请求的文件名不是真实目录,则此条件为真。

只有当所有这些条件都为真(它们用 AND 链接在一起)时,我们才回到重写规则:

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

此重写步骤的结果定义为第二个和第三个参数。$1再次使用与匹配的内容一样,并且参数定义该规则,如果最初匹配,将是最后一个规则(L),并且重写目标中定义的任何查询字符串将被附加到原始 URL (QSA)。

批判:

MVC 框架的通常重写尝试尽可能提高性能。为了成功重写,必须评估所有重写条件。仅当任何 RewriteCond 返回 false 时才会停止。每个被重写的请求都要经过大量的 CPU 密集测试。首先是 RewriteRule 正则表达式,然后是第一个 RewriteCond 中的正则表达式,然后对文件系统进行两次硬盘测试以检查文件是否存在。

另一方面,第一个 RewriteCond 似乎是不必要的。它会测试某些名称,如果找到,则中止重写。 “index.php”应该被第二个 RewriteCond 检测到,因为它是一个现有文件(如果没有,重写将如何工作)。任何以“资源”开头的内容也将被匹配,但可能不应该出于相同的原因:第二个 RewriteCond 将找到现有资源。最后是“robots.txt”文件。如果您想在机器人获取您的网站时避免 404,那么拥有一个可能是空的总是一个好主意。

由于您没有更改查询字符串中的任何内容,因此不需要 [QSA] 指令。

改进:

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

第一个 RewriteRule 将匹配整个请求的路径。两个RewriteCond以[OR]连接,因此第一个返回true的RewriteCond将取消进一步的评估。第一个 RewriteCond 测试请求的文件是否存在。如果存在,则返回true,处理返回到第一个RewriteRule。目标表达式为“-”,表示“不重写”。 [L] 停止进一步处理重写规则。所以最后,对于一个现有文件,我们只有一个正则表达式和一个文件系统测试,之后,这个现有文件将被发送到浏览器。

如果没有找到文件,则第一个RewriteRule和RewriteCond不会触发,因此那里的[L]不会停止该过程。所以第二个RewriteRule被执行。这个是无条件的,正则表达式和以前一样,匹配所有内容,并将其重写为“index.php”。

如果存在任何文件,包括/forum/login.php,则此重写不会调用您的index.php。

您可以将第二个更改为RewriteRule ^.*$ index.php/$0 [L]如果你确实想继续解析$_SERVER['PATH_INFO']代替$_SERVER['REQUEST_URI'].

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

特定文件的 mod_rewrite 异常 的相关文章

  • 性能方面插值(直接插入字符串)VS串联[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 学说 - 获取下一个和上一个记录

    这样我就已经获取了一些记录 我已创建日期字段 现在我想按日期获取下一条和上一条记录 通过以下方式让它工作 qb this gt createQueryBuilder a next qb gt expr gt gt a created dat
  • 使用 htaccess 文件重定向[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 Edit 我想重定向一个网址 to www example com location sydney from www example com rss
  • Drupal 模板/主题资源或建议?

    我有兴趣为我正在开发的 Drupal 网站创建自定义主题 我是 Drupal 的新手 但是我在处理构建主题 CSS PHP HTML 所需的基本概念方面拥有相当多的经验 所以 我的问题是 我从哪里开始 有创建 Drupal 主题的规范指南吗
  • 从 PHP 中的平面路径数组构建目录树

    所以 标题可能令人困惑 但我不知道如何表达这种数组结构 它肯定是一个树结构 但至于它的创建 这正是我所渴望的 它似乎不遵循典型的递归数组树构建 我正在尝试从平面路径数组创建列目录布局 每个路径都位于其自己的多维数组内 该数组旨在构建 mac
  • 如何使用 Zend 2 http 发送 json 数据?

    我已经为此苦苦挣扎了几天 我需要将一组以 json 编码的数据发送到 api 我正在尝试使用 Zend 2 http 来实现这一点 但到目前为止我还没有运气 以下是 api 手册的内容 Bulk Create Contacts This c
  • 从 Yii 中的 registerScript 方法强制执行脚本顺序

    我创建了一个小部件 它注册了自己的脚本 如下所示 class MyWidget extends CWidget public function run Yii app gt clientScript gt registerScript CL
  • PHP:会话.auto_start

    我在同一台服务器上有两个项目 它们的设置在 session auto start 中冲突 相关post https stackoverflow com questions 1378324 php setting variables in i
  • 使用 PHPUnit 模拟对象是否有可能期望调用神奇的 __call() 方法?

    我在测试中有一个模拟对象 真实的对象 PageRepository 使用 call 实现了一个神奇的方法 因此如果您调用 pageRepository gt findOneByXXXX value of field XXXX 它将在数据库中
  • phpstorm 和 xdebug 之间的连接

    我配置了 phpstorm xdebug 并且能够使用断点调试我的代码 这些天我更新了 php 通过brew 和 xdebug 现在我有 php 5 5 26 和 xdebug 2 3 3 当我尝试调试测试 和代码 时 phpstorm 告
  • PHP 中的致命错误是什么意思?

    我收到以下错误 致命错误 未捕获错误 调用未定义的函数 var dumb 这是什么意思 致命错误是什么意思 这是一个导致脚本中止并立即退出的错误 致命错误之后的所有语句都不会被执行
  • 解决错误 413 请求实体太大

    我正在从事的项目允许我们的员工将大文件上传到我们的共享主机并获取下载链接 问题是我们的托管拒绝更改共享托管的 LimitRequestBody 还有其他解决方案可以解决 LimitRequestBody 或任何其他方法来完成这项工作吗 有两
  • 550 Bad HELO - 主机冒充域名 Laravel

    我正在尝试设置 Laravel 身份验证 包括 密码重置 功能 但当我尝试发送电子邮件时 我偶然发现了一个错误 我得到的错误是 Expected response code 250 but got code 550 with message
  • 使用命名占位符时 PHP/SQL 插入错误

    我有以下 PHP PDO 语句 STH this gt db gt prepare INSERT INTO UserDetails FirstName LastName Address City County PostCode Phone
  • GWT 与 Apache Wicket

    GWT 和 Wicket 都是有状态的 基于 Java 对象的 GWT 完全基于客户端 具有 javascript 优化 CSS 优化等功能 而且我对 Apache Wicket 还很陌生 我对 Wicket 的了解越多 就越感觉它与 GW
  • 无法使用symfony2连接数据库oracle

    我需要的 我需要将oracle数据库与symfony2连接 我已经通过 php m 检查过 oci8 pdo odbc odbc 这是我关注的链接https gist github com johnkary 6481664 https gi
  • WordPress ~ 如何在一页上显示多个 Google Chart?

    下面是我插入到 WordPress Visual Composer 中的原始 HTML 块中的一个 Google 图表的代码 图表 ID 名称为 chart div1 这适用于我的 WP 网页
  • 使用 Laravel Intervention 库缓存动态图像不起作用

    我目前正在使用 Laravel 5 并利用干预图像集成 http image intervention io http image intervention io 我动态地使用它 因此图像具有如下 URL http example org
  • PHP 中的舍入

    a 0 1 0 7 10 int 0 1 0 7 10 PHP 返回 false 有人能给我解释一下 为什么会发生这种情况吗 第一个返回 8 第二个返回 7 引用PHP 浮点精度手册中的大红色警告 http de3 php net manu
  • Elasticsearch 如何使用通配符进行 OR 查询

    我很难尝试使用 elasticsearch 构建查询 我想查询类似的内容 WHERE field 1 is match string OR field 2 is wildcard match string OR field 3 is fuz

随机推荐