php中重写里面RewriteCond %REQUEST_FILENAME !-f是啥意思

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php中重写里面RewriteCond %REQUEST_FILENAME !-f是啥意思相关的知识,希望对你有一定的参考价值。

RewriteCond 重写条件
%REQUEST_FILENAME 由Apache服务器解析成文件名
!-f 代表 不存在

整句语句意思是:
如果访问的文件不存在

这句是Apache的配置文件里的其中一句,通常会跟上一句类似下面的语句
RewriteRule index.html index.php

意思是如果 index.html文件不存在,那么跳转到index.php文件
参考技术A 这句话的意思就是:

如果文件存在,就直接访问文件,不进行下面的RewriteRule.

删除 index.php url 重写 .htaccess

【中文标题】删除 index.php url 重写 .htaccess【英文标题】:remove index.php url rewriting .htaccess 【发布时间】:2013-09-15 13:14:42 【问题描述】:

我为301 redirect编写了这段代码

RewriteCond %THE_REQUEST ^.*\/index\.php\ HTTP/
RewriteRule ^(.*)index\.php$ /$1 [R=301,L]

如果我以http://mysite.com/index.php 访问我的网站,它会很好地工作,它会将我重定向到http://mysite.com

但是在我的localhost 上,如果我尝试以localhost/mysite/index.php 访问index.php,它会将我重定向到localhost

我该如何解决这个问题?上面写的代码对吗?

【问题讨论】:

在您的本地主机上,您需要在这些行上方添加RewriteBase /mysite/,因为该站点不在服务器的根目录中 【参考方案1】:

看起来您的 htaccess 文件位于服务器的文档根目录中,并且位于 localhost 的 mysite 目录中。由于 htaccess 文件的位置对于它如何路由 URI 非常重要,因此您需要使其与文件的位置无关。您可以通过从条件中提取路径信息而不是传递到规则中以匹配的 URI 来做到这一点:

RewriteCond %THE_REQUEST ^[A-Z]3,9\ /(.*)index\.php($|\ |\?)
RewriteRule ^ /%1 [R=301,L]

%THE_REQUEST 变量是实际 HTTP 请求的第一行,类似于:

GET /path/index.php HTTP/1.1

该模式首先匹配任意数量的可能的METHODS(GET、POST、HEAD 等),然后它创建一组 URI 路径分组,该分组是 before @987654325 @,然后结束匹配,因为我们并不关心 index.php 之后的内容。

【讨论】:

这段代码是如何工作的RewriteCond %THE_REQUEST ^[A-Z]3,9\ /(.*)index\.php($|\ )?关于元素的一点解释 仍然无法处理 localhost。我被重定向到 localhost 而不是 localhost/mysite 它是否捕获了 URL 参数?【参考方案2】:

试试这个

RewriteRule ^(.*)index\.php$ /$1 [R=301,NC] 

【讨论】:

有什么区别? [r=301,nc] [nc] 指定 http 主机不区分大小写。 L 指定了什么? OPs 问题不在于大写/小写,而在于站点基础。 L=Last ... 在此之后将不再处理任何重写。我对添加RewriteBase指令的问题发表了评论【参考方案3】:

如果您的站点不在服务器的根目录(不在您的本地主机上),则需要添加 RewriteBase 指令:https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase

你需要添加一行:

RewriteBase /mysite/

在本地主机上的 htaccess 中的当前行之上

【讨论】:

是否有任何解决方案对双方都有效(即localhostserver【参考方案4】:

虽然RewriteBase 指令代表这种用法,但您可能希望测试 localhost 并仅在 test == true 时将 root 重写到您的子目录。例如:

RewriteCond %HTTP_HOST ^localhost$
RewriteCond %REQUEST_URI !^/subdirectory/
RewriteRule (.*) /subdirectory/$1 [L]

请注意,我已经有一段时间没有使用它了,不能保证它可以开箱即用;可能需要一些修改。

【讨论】:

以上是关于php中重写里面RewriteCond %REQUEST_FILENAME !-f是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

Torch实现ReQU,和梯度验证

Apache htaccess 重写假设文件存在!

URL重写会删除网址结尾

htaccess rewritecond 不工作

删除 index.php url 重写 .htaccess

带有参数的 url 的 RewriteCond