特定文件的 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 异常 的相关文章

  • 从 Django 运行 shell 命令

    我正在 Django 中开发一个网页 使用 apache 服务器 需要调用 shell 命令来启用 禁用一些守护进程 我尝试这样做 os system service httpd restart 1 gt HOME out 2 gt HOM
  • 简单的 PHP 条件帮助: if($Var1 = in list($List) and $Cond2) - 这可能吗?

    这是一个可能的功能吗 我需要检查一个变量是否存在于我需要检查的变量列表中 并且 cond2 是否为 true 例如 if row name 1 2 3 Cond2 doThis 它对我不起作用 我在复制粘贴中更改的只是我的列表和变量名称 i
  • Laravel 从 5.6 升级到 Laravel 6

    我有一个项目https github com javedbaloch4 Laravel Booking https github com javedbaloch4 Laravel Booking发展于Laravel 5 6现在我想将其升级到
  • 当数据验证失败时保留表单字段中的值

    我在弄清楚验证失败时如何保留用户数据时遇到问题 我对 PHP 有点陌生 所以我的逻辑可能会犯一些巨大的错误 目前 如果验证失败 所有字段都会被清除 并且 Post 数据也会消失 这是一些代码 假设用户输入无效电子邮件 我希望保留 名称 字段
  • 重定向而不改变url

    我总是不喜欢 htaccess 我正在尝试建立一个所有请求都通过index php 的网站 但我希望URL 类似于www sample com home 该网址实际上会加载 www sample com index php page hom
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • Yii 使用 ajax 进行分页

    我需要使用ajax启用分页 我的代码 控制器 更新内容ajax function actionIndex dataProvider new CActiveDataProvider News array pagination gt array
  • Woocommerce 让产品显示在存档页面中

    我正在尝试让所有产品显示在我商店的存档页面中 我想知道他们的id我正在使用我的一个钩子 它在 wp head 上运行并检查 if is product category 我想以某种方式访问 产品的查询并获取它们的 ID if is prod
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • 蛋糕控制台 2.2.1:烘焙错误

    运行 MAMP 的 OSX 机器 CakePHP 2 2 1 已正确安装和配置 这意味着当我浏览到 Index php 文件时 所有绿色条都显示出来 我已经完成了博客教程 并且正在开发我的第二个应用程序 其中脚手架已启动并运行 现在我第一次
  • 将“php”作为 shell 脚本执行时的自定义 php.ini 文件

    我在跑php作为 shell 脚本 我不确定 shell脚本 是否正确 该文件以 usr bin php 这很好用 但 MongoDB 类没有正确加载php ini文件 具有extension mongo so 未使用 我该如何使用它tha
  • 交换关联数组中的两个项目

    Example arr array apple gt sweet grapefruit gt bitter pear gt tasty banana gt yellow 我想调换一下柚子和梨的位置 这样数组就变成了 arr array ap
  • 缺少依赖项 hive-builtins 会导致 Oozie 构建失败,错误代码为 410

    我尝试从源代码构建 oozie 但安装失败 我想安装 oozie 并热切地等待使用它 我在这个阶段失败了 当我从 oozie 3 3 3 目录给出 cmd 时 bin mkdistro sh DskipTests 我收到这个错误 INFO
  • PHP 在输入流中使用 fwrite 和 fread

    我正在寻找将 PHP 输入流的内容写入磁盘的最有效方法 而不使用授予 PHP 脚本的大量内存 例如 如果可以上传的最大文件大小为 1 GB 但 PHP 只有 32 MB 内存 define MAX FILE LEN 1073741824 1
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • 使用 Ajax.Request 将 JSON 从浏览器传递到 PHP 的最佳方法

    您好 我有一个 JSON 对象 它是一个二维数组 我需要使用 Ajax Request 将其传递给 PHP 我知道的唯一方法 现在我使用js函数手动序列化我的数组 并获取以下格式的数据 s 1 d 3 4等 我的问题是 有没有办法更直接 有
  • php,统计字符并删除超过140个字符的内容

    我需要一个 PHP 函数来计算短语的字符数 如果短语长度超过 140 个字符 则此函数应删除所有其他字符并在短语末尾添加三个点 例如我们有 message I am what I am and you are what you are et
  • 使用正则表达式提取两个短语之间的所有单词[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下正则表达式提取两个短语之间的所有单词 b item W w W 0 2 1 one W w W 0 3 business b b item W w W 0 2 3 three W w W 0 3
  • 为什么 Composer 降级了我的包?

    php composer phar update这样做了 删除了 2 3 0 软件包并安装了整个 2 2 5 Zend Framework php composer phar update Loading composer reposito
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐