我的 .htaccess 文件中的 $1 [QSA,L] 是啥意思?

Posted

技术标签:

【中文标题】我的 .htaccess 文件中的 $1 [QSA,L] 是啥意思?【英文标题】:What does $1 [QSA,L] mean in my .htaccess file?我的 .htaccess 文件中的 $1 [QSA,L] 是什么意思? 【发布时间】:2012-09-15 02:34:16 【问题描述】:

我需要更改我的.htaccess 并且有两行我不明白。

RewriteCond %REQUEST_FILENAME !-l

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

什么时候应该使用这些行?

【问题讨论】:

阅读:httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa ***.com/questions/60463906/… htaccess tutorial for beginnershelponnet.com/2021/04/15/htaccess-tutorial-for-beginers 【参考方案1】:

如果满足以下条件,则重写 URL: 如果请求的文件名不是目录,

RewriteCond %REQUEST_FILENAME !-d

如果请求的文件名不是存在的常规文件,

RewriteCond %REQUEST_FILENAME !-f

如果请求的文件名不是符号链接,

RewriteCond %REQUEST_FILENAME !-l

然后按以下方式重写 URL: 获取整个请求文件名并将其作为“url”查询参数的值提供给 index.php。将原始 URL 中的任何查询字符串附加为进一步的查询参数 (QSA),并停止处理此 .htaccess 文件 (L)。

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

Apache docs #flag_qsa

另一个例子:

RewriteRule "/pages/(.+)" "/page.php?page=$1" [QSA]

使用 [QSA] 标志,请求

/pages/123?one=two

将被映射到

/page.php?page=123&one=two

【讨论】:

【参考方案2】:

这里不是给出完整教程的地方,但简而言之;

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 表示如果规则匹配,则不再处理该规则以下的任何 RewriteRules。

有关这方面的更完整信息,请点击上面的链接。重写支持可能有点难以掌握,但有很多关于 *** 的示例可供学习。

【讨论】:

QSA 将 ? 替换为 &,因此无法区分 /page&foobar/page?foobar。如何阻止 QSA 将 ? 替换为 & 我相信记住所有可以建立关联的东西,例如:QSA 代表查询字符串附加; L 代表last(表示执行并停止寻找下一个巧合) -d 目录.. -f 文件【参考方案3】:

这将捕获对 version 等文件的请求, release, 和README.md 等应该是 被视为端点,如果定义(如在 /release 的情况下),或“未找到”。

【讨论】:

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

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

htaccess 301 重定向 - 删除查询字符串 (QSA)

htaccess - 子域作为 GET 参数

目录存在时htaccess重写url重定向

.htaccess RewriteRule 导致 403 Forbidden

php 去除路由中index.php 通过 .htaccess 文件