105

我需要改变我的.htaccess,有两行我不明白。

RewriteCond %{REQUEST_FILENAME} !-l

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

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

4

3 回答 3

228

不是提供完整教程的地方,但简而言之;

RewriteCond基本上意味着“仅当这是真的时才执行下一个 RewriteRule”。!-l路径是请求不是链接的条件(表示!不是,-l表示链接)

RewriteRule基本上意味着如果完成的请求匹配(^(.+)$匹配除服务器根目录之外的任何 URL),它将被重写为index.php?url=$1,这意味着请求olle将被重写为index.php?url=olle)。

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

L表示如果规则匹配,则不再处理低于此规则的任何 RewriteRules。

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

于 2012-09-23T10:30:11.887 回答
11

如果满足以下条件,则重写 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 文档 #flag_qsa

另一个例子:

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

使用 [QSA] 标志,请求

/pages/123?一=二

将映射到

/page.php?page=123&一=二

于 2017-07-21T00:03:05.577 回答
0

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

于 2017-09-13T04:50:23.170 回答