gpt4 book ai didi

php - 特定文件的mod_rewrite异常

转载 作者:可可西里 更新时间:2023-10-31 23:03:05 25 4
gpt4 key购买 nike

我的页面未重定向,因为我的.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框架,因此我会收到类似 /controller/method/argument的网址,但是当我重定向到/forum/login.php时,它会切成/forum/。

我如何将其添加为异常(exception),以便能够重定向到 /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
如果请求的文件名不是硬盘上的真实文件,则此条件为true。
RewriteCond %{REQUEST_FILENAME} !-d
如果请求的文件名不是真实目录,则此条件为true。

仅当所有这些条件都为真(它们与AND链接在一起)时,我们才返回到重写规则:
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
此重写步骤的结果定义为第二个和第三个参数。 $1与匹配内容一起再次使用,并且参数定义该规则(如果最初匹配)将是最后一个规则(L),并且重写目标中定义的任何查询字符串都将附加到任何查询字符串后在原始网址(QSA)中。

批判:

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

另一方面,第一个RewriteCond似乎是不必要的。它测试某些名称,如果找到,则中止重写。第二个RewriteCond应该检测到“index.php”,因为它是一个现有文件(如果没有,重写将如何工作)。以“resources”开头的任何内容也将被匹配,但出于相同的原因,可能不应该匹配:现有资源将在第二个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']

关于php - 特定文件的mod_rewrite异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12865780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com