RewriteRule ^(.*)/$ ?path=$1 [QSA,L] 在我的 .htaccess 中是啥意思?

Posted

技术标签:

【中文标题】RewriteRule ^(.*)/$ ?path=$1 [QSA,L] 在我的 .htaccess 中是啥意思?【英文标题】:What does RewriteRule ^(.*)/$ ?path=$1 [QSA,L] mean in my .htaccess?RewriteRule ^(.*)/$ ?path=$1 [QSA,L] 在我的 .htaccess 中是什么意思? 【发布时间】:2013-12-14 03:55:20 【问题描述】:

我需要在 nginx 中创建重写,就像在我的 .htaccess 中所做的那样,有些行我不完全理解。

DirectoryIndex index.php

RewriteEngine on
RewriteCond % !-f
RewriteRule ^(.*)/$ ?path=$1  [QSA,L]

谁能给我解释一下?

【问题讨论】:

这是不正确的:RewriteCond % !-f 我怀疑这是不正确的,但它可以工作并且可以工作很长时间。我刚刚开始了解当前的配置并进行更正。 【参考方案1】:

这意味着如果请求不是针对文件,则将结尾/ 之前的所有内容重写为index.php?path=,然后是之前匹配的内容。

它应该是最后一条规则 (L),它应该附加查询字符串 (QSA),而不是因为替换的查询字符串而丢弃它。

【讨论】:

非常感谢 Alex 的回答。【参考方案2】:

RewriteCond % !-f 似乎不正确的规则条件,并且总是评估为真。

这条规则:

RewriteRule ^(.*)/$ ?path=$1  [QSA,L]

是否匹配任何带有斜杠的 URI 并在内部重写为 /?path=uri-without-slash

例如:URI /foo/ 将被重写为 /?path=foo

QSA - 查询字符串追加 L = 最后一条规则

参考:Apache mod_rewrite Introduction

更新:将不正确的条件更改为:

# request is not for a file
RewriteCond %REQUEST_FILENAME !-f
# request is not for a directory
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)/$ ?path=$1 [QSA,L]

【讨论】:

非常感谢阿努巴瓦。很抱歉,不能对你的名声+。还有一个问题 - 不正确的 RewriteCond 会损害安全性吗? 这种不正确的情况有时可能会给您带来意想不到的结果。我建议根据我上面编辑的回复进行更改。

以上是关于RewriteRule ^(.*)/$ ?path=$1 [QSA,L] 在我的 .htaccess 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

5.5版本以上”No input file specified“问题解决

5.5版本以上”No input file specified“问题解决

RewriteRule ^(.*)$ 和 RewriteRule (.*)$ 之间的区别

如何防止 301 重定向中的附加参数

thinkphp5 伪静态后出现No input file specified.问题

。htaccess对RewriteRule的帮助