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 中的当前行之上
【讨论】:
是否有任何解决方案对双方都有效(即localhost
和server
)【参考方案4】:
虽然RewriteBase
指令代表这种用法,但您可能希望测试 localhost 并仅在 test == true 时将 root 重写到您的子目录。例如:
RewriteCond %HTTP_HOST ^localhost$
RewriteCond %REQUEST_URI !^/subdirectory/
RewriteRule (.*) /subdirectory/$1 [L]
请注意,我已经有一段时间没有使用它了,不能保证它可以开箱即用;可能需要一些修改。
【讨论】:
以上是关于php中重写里面RewriteCond %REQUEST_FILENAME !-f是啥意思的主要内容,如果未能解决你的问题,请参考以下文章