我有 Apache 服务器版本2.4.18 (Ubuntu)
。
我有RewriteRule
适用于我网站大部分内容的条件。我想从/norewrite
该重写中排除以 开头的路径。
重写后如下:
RewriteCond <condition 1>
RewriteCond <condition 2>
RewriteRule ^.*$ https://example.com [L]
我尝试排除/norewrite
以下情况:
RewriteCond <condition 1>
RewriteCond <condition 2>
RewriteCond %{REQUEST_URI} !^/norewrite
RewriteRule ^.*$ https://example.com [L]
我也尝试过不同的语法,例如!/norewrite
,!norewrite
和,但是当其他 2 个条件为真时,!^\/norewrite
以 开头的地址仍然会被重写。/norewrite
在阅读了 Apache 文档后RewriteCond
,RewriteRule
我相信这应该可行。我在这里做错了什么?
答案1
您的问题中示例的代码本身看起来不错,提供:
您没有
OR
在前面的状况这将使下一个条件(排除特定的 URL 路径)成为可选的。这些指令在您的配置中足够靠前,以避免与其他 mod_rewrite 指令发生冲突。请注意,
REQUEST_URI
如果您有较早的指令重写 URL,则服务器变量会就地更新。没有冲突的 mod_alias
Redirect
或RedirectMatch
覆盖这些 mod_rewrite 指令的指令。请注意命令没关系;无论如何,mod_alias 指令都会执行。
RewriteCond <condition 1> RewriteCond <condition 2> RewriteCond %{REQUEST_URI} !^/norewrite RewriteRule ^.*$ https://example.com [L]
请注意,通过在RewriteRule
代换这将隐式触发 302(临时)外部重定向,而不是您暗示的“重写”。如果这应该是“重定向”,那么您应该明确说明并包含该R
标志 - 更易读并避免将来出现潜在错误。
一个小问题,但你也错过了绝对 URL 末尾的斜杠(代换字符串)。如果省略它,则依赖于用户代理在重定向请求中附加斜线(所有主流浏览器都应这样做)。
如果您只想排除单个 URL 路径,则不需要单独的条件。由于您目前没有对RewriteRule
图案,在 中执行此检查会更有效率RewriteRule
。
例如:
RewriteCond <condition 1>
RewriteCond <condition 2>
RewriteRule !^/?norewrite https://example.com/ [R=302,L]
注意:最后一个RewriteCond
不应该有OR
标志,否则规则将无条件执行。(它本质上被视为... OR true
。)
这RewriteRule
图案首先处理,因此上述内容表明,对于所有不以 、 开头的 URL 路径,/norewrite
都适用<condtion1>
<condition2>
代换。