嗨,我正在尝试让 htaccess 仅在不存在具有该名称的文件、符号链接或目录时才进行重写。我已成功完成此操作:
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]
RewriteRule ^(.*)$ index\.php?var=$1 [QSA,L]
运行完美,但是我只希望这发生在根目录中,而不是任何子目录中。我如何以通用方式实现这一点(这意味着我不想在 .htaccess 文件中明确说明 URL)?
答案1
为了防止任何 mod_rewrite 指令被处理以处理文档根目录之外的请求,请将以下规则放在文件顶部:
# Prevent further processing if the request is outside the root directory
RewriteRule / - [L]
上面的内容基本上表明,对于任何包含斜杠的请求 URL 路径,都在此处停止。(这也会捕获以斜杠结尾的请求 - 这是个问题吗?)
或者,您可以使现有两个规则的正则表达式更加具体,以便它仅适用于根目录中的请求。
例如:
# Only apply rules to requests in the root directory
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^[^/]+$ - [L]
RewriteRule ^([^/]*)$ index.php?var=$1 [QSA,L]
第一条规则上的标志PT
不是必需的。并且第一条规则中的捕获组也不是必需的。代换字符串不需要使用反斜杠转义。
注意:这也会无法处理以下请求结尾带有斜线。
然而,如果这些是你唯一与此相关的规则,那么你不需要 需要两条规则,只需要一条,前提是请求文档根目录本身时不包含 URLvar
参数。例如:
DirectoryIndex index.php
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ index.php?var=$1 [QSA,L]
请注意状况被逆转了。
如上所述,对根目录本身的请求将直接发送到index.php
(通过 mod_dir),而不是index.php?var=
。