我的 .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 beginners
helponnet.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 301 重定向 - 删除查询字符串 (QSA)