在 Apache2 中使用 RewriteCond 从 RewriteRule 中排除路径

在 Apache2 中使用 RewriteCond 从 RewriteRule 中排除路径

我有 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 文档后RewriteCondRewriteRule我相信这应该可行。我在这里做错了什么?

答案1

您的问题中示例的代码本身看起来不错,提供:

  • 您没有OR在前面的状况这将使下一个条件(排除特定的 URL 路径)成为可选的。

  • 这些指令在您的配置中足够靠前,以避免与其他 mod_rewrite 指令发生冲突。请注意,REQUEST_URI如果您有较早的指令重写 URL,则服务器变量会就地更新。

  • 没有冲突的 mod_aliasRedirectRedirectMatch覆盖这些 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>代换

相关内容