htaccess 中的 [QSA, L] 中的 L 是啥

Posted

技术标签:

【中文标题】htaccess 中的 [QSA, L] 中的 L 是啥【英文标题】:What is L in [QSA, L] in htaccesshtaccess 中的 [QSA, L] 中的 L 是什么 【发布时间】:2013-05-04 07:15:08 【问题描述】:

QSA 表示如果有一个查询字符串与原始 URL 一起传递, 它将被附加到重写(olle?p=1 将被重写为 index.php?url=olle&p=1.

L 表示如果规则匹配,则不再处理下面的 RewriteRules 这个。

您好,有哪些简单的例子可以解释 L 的使用? 我似乎无法理解上面的解释。任何帮助将不胜感激。 谢谢。

【问题讨论】:

查看此链接:httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa mod_rewrite 中的 QSA 标志:helponnet.com/2021/04/27/htaccess-qsa-flag 【参考方案1】:

QSA 标志意味着在重写 URI之后附加一个现有的查询字符串。示例:

URL=http://example.com/foo/bar?q=blah

规则:

RewriteRule ^foo/(.*)$ /index.php?b=$1

结果=/index.php?b=bar

注意q=blah 是如何消失的。因为现有的查询字符串被删除,取而代之的是规则目标中的查询字符串 (b=$1)。现在,如果您包含 QSA 标志:

RewriteRule ^foo/(.*)$ /index.php?b=$1 [QSA]

结果变成=/index.php?b=bar&q=blah


L 标志只是意味着停止应用任何遵循的规则。给定相同的 URL,http://example.com/foo/bar?q=blah,并给出规则:

RewriteRule ^foo - 

RewriteCond %REQUEST_URI !^/bar.php
RewriteRule ^(.*)$ /bar.php?z=$1 

第一个规则被应用并且 URI 不变地通过(通过- 目标)。然后重写引擎处理下一条规则,并将 URI 重写为/bar.php?z=foo/bar。在末尾添加L 会发生什么:

RewriteRule ^foo - [L]

RewriteCond %REQUEST_URI !^/bar.php
RewriteRule ^(.*)$ /bar.php?z=$1 

URL http://example.com/foo/bar 从第一条规则原封不动地通过,然后由于L 标志而停止。如果 URL 是 http://example.com/something/else,则第一个规则不匹配,并应用第二个规则,将 URI 重写为:/bar.php?z=something/else

请注意,由于重写引擎会循环遍历所有规则,直到 URI 停止更改,L 标志将不会阻止循环,只有在当前迭代中应用任何进一步的规则。

【讨论】:

QSA 将 ? 替换为 &,因此无法区分 /page&foobar/page?foobar。如何阻止 QSA 将 ? 替换为 & @Pacerier 如果您需要在新查询字符串中编码查询字符串,那么您可能需要考虑使用 %QUERY_STRING 变量而不是使用 QSA【参考方案2】:

.htaccess 标志列表

C(与下一条规则链接) CO=cookie(设置指定的cookie) E=var:value(将环境变量 var 设置为值) F(禁止 - 向用户发送 403 标头) G(已消失 - 不再存在) H=handler(设置处理程序) L(最后 - 停止处理规则)

最后一条规则:在前面的指令处理完毕后,指示服务器停止重写。

N(下一个 - 继续处理规则) NC(不区分大小写) NE(不要在输出中转义特殊的 URL 字符) NS(如果请求是子请求,则忽略此规则) P(代理 - 即 apache 应获取替换部分中指定的远程内容并将其返回) PT(传递 - 在处理带有其他处理程序的 URL 时使用,例如 mod_alias) R(临时重定向到新 URL) R=301(永久重定向到新 URL) QSA(将查询字符串从请求附加到替代 URL) S=x(跳过下 x 条规则) T=mime-type(强制指定 mime 类型)

标记被添加到重写规则的末尾,以告诉 Apache 如何解释和处理规则。它们可用于告诉 apache 将规则视为不区分大小写,如果当前规则匹配则停止处理规则,或各种其他选项。它们以逗号分隔,并包含在方括号中。

【讨论】:

【参考方案3】:

[L,QSA] 示例

之前:https://example.com/index.php?user=robert

RewriteEngine On
RewriteRule ^user/([^/]+)?$ index.php?user=$1 [L,QSA]

之后:https://example.com/user/robert?query=value

您也可以使用其他查询。

喜欢:robert?query=value&query2=value2&query3=value3

【讨论】:

以上是关于htaccess 中的 [QSA, L] 中的 L 是啥的主要内容,如果未能解决你的问题,请参考以下文章

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

htaccess 一般配置

[转]ThinkPHP5 隐藏index.php问题

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

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

htaccess - 子域作为 GET 参数