我正在寻求帮助,以了解特定.htaccess文件的工作原理。
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
以下是我认为到目前为止我理解的内容:
第1行:允许Apache根据某些规则更改url?
第2、3行:关于不访问文件和目录的内容。然而,我的浏览器在访问http://localhost/dev/can_i/yes_i_can.php
时没有问题,所以我认为我没有正确理解这一点。
第4行:我知道^(.*)$
是一个正则表达式,说"以任何东西开头和结尾",但它到底指的是什么?整个url?然后,它被index.php替换,并附加表达式。那么我们为什么不得到像localhost/index.php?url=localhost/index.php/whatever_came_after
这样的东西呢?最后,[L,QSA]做什么?我知道QSA的意思是"查询字符串附加",但不确定它是如何工作的。
非常感谢您的帮助。
这将启用apache mod_rewrite
RewriteEngine on
这两行表示,如果浏览器中指定名称的文件不存在,或者浏览器中的目录不存在,则执行下面的重写规则
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond的基本意思是"只有当这是真的时才执行下一个RewriteRule"。!-l
路径是请求不针对链路的条件(!表示不,-l
表示链路)
RewriteRule基本上意味着,如果完成的请求与^(.+)$
匹配(与除服务器根之外的任何URL匹配),它将被重写为index.php?url=$1,这意味着对olle的请求将被重写为index.php?url=olle。
QSA
意味着,如果有一个查询字符串与原始URL一起传递,它将被附加到重写中(olle?p=1将被重写为index.php?url=olle&p=1
。
L表示如果规则匹配,则不再处理低于此规则的"重写规则"。
有关这方面的更多完整信息,请访问上面的链接。重写支持可能有点难以理解,但有很多关于stackoverflow的例子可以学习。