这有可能使用正则表达式来实现吗?
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]
我有一个奇怪的 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]