这有可能使用正则表达式来实现吗?

Is this a possible to achieve using regex?

我有一个奇怪的 URL 在不应该给出 200 状态。它应该只给出 404 错误。我可以在 htaccess 中为此使用 404 重定向吗?

不错URL看起来像这样

www.example.com/this-is-static/anytext

www.example.com/this-is-static/anytext/alsoanytext_123

www.example.com/this-is-static/anytext/alsoanytext_123-123

www.example.com/this-is-static/anytext/alsoanytext/alsoanytextagain_123-123

不好的URL长这样

www.example.com/this-is-static/anytext/alsoanytext

旁注:单词anytext、alsoanytext和alsoanytextagain是随机通配符* ...它们可以是任何单词。数字“123”可以是数字的任意组合

“this-is-static”没有改变

如您所见,错误的 URL 没有“_XXXXXX”部分

我基本上需要它,这样如果 URL 到达子文件夹“alsoanytext”(及以后)但是 后面没有下划线,到 404 重定向

希望这是有道理的

编辑 2:

我不确定下面的方法是否有效,因为正则表达式匹配所有 URL,除了“坏的”,如果没有为所有其他子文件夹设置新规则,这使得 htaccess 不可能做到这一点。

只是为了简化,以此为例,(https://regexr.com/5e5fd)我们如何得到这条线

www.example.com/this-is-static/anytext/alsoanytext

成为唯一匹配项

对 non-capturing 组使用以下表达式:

www.example.com\/this-is-static\/[^\/\s]*(?:\/[^_\s]+_.*)?$

解释:

  • 定期匹配所有 www.example.com/this-is-static/
  • 匹配除斜线以外的所有内容 ([^\/\s]*)。
  • ?: Non-capturing /alsoanytext 内容组。末尾的 ? 量词使这部分成为可选部分,因此没有任何其他内容的 /anytext 也匹配。
  • \/现在匹配斜杠。
  • [^_\s]+ 匹配除下划线以外的所有内容。
  • 匹配下划线_.
  • 匹配除换行符以外的任何其他内容.*。如果无法全部匹配,请使用您喜欢的方法来匹配 URL 的其余部分。
  • 匹配字符串的结尾$。需要确保 /anytext 除了格式正确的 /alsoanytext_whatever 之后没有任何内容。否则,当使用错误的 URL 时,您可能会出现部分匹配(因为开头将匹配 /anytext)。

你可以在regexr看到它。

这有两个方面...正则表达式和 Apache .htaccess

www.example.com\/this-is-static\/[^\/\s]*(?:\/[^_\s]+_.*)?$

@MarcSances 似乎创建了匹配“好”URLs (+1) 的正则表达式。 (虽然你需要 \s(空格)作为否定字符 class 的一部分吗?)使用 mod_rewrite 你可以简单地 negate 这个正则表达式(带有 ! 前缀)到 not-match 好 URLs(即“坏”URLs 成功)。

在 Apache 配置文件中,您不需要 backslash-escape 斜杠,因为斜杠没有特殊含义(没有 regex-delimiters,除了 空格 作为参数定界符)。 (不幸的是 regexr.com 不允许您更改正则表达式分隔符?!)

请注意,使用 RewriteRule 指令,您只能匹配 URL-path(减去 .htaccess 中的斜杠前缀),而不是主机名。

RewriteRule ^this-is-statis\/[^\/\s]*(?:\/[^_\s]+_.*)?$ error.php [R=404,L]

当您为 R 标志指定非 3xx 状态时,substitution 字符串(即本例中的 error.php)将被忽略。您应该指定一个连字符 (-) 而不是明确指示“无替换”。此外,L 标志是多余的,它是隐含的。

所以,要否定这个表达式,它会变成:

RewriteRule !^this-is-statis/[^/]*(?:/[^_]+_.*)?$ - [R=404]

将为请求的 URL 与“好 URL”不匹配的 404 ErrorDocument 提供服务。


/this-is-static/anytext/alsoanytext

但是,看起来您应该能够直接匹配“错误的”URL,除非 alsoanytext 本身可以合法地包含下划线 (_)。例如:

RewriteRule ^this-is-static/[^/]+/[^/_]+$ - [R=404]