提问人:adrianTNT 提问时间:11/13/2023 更新时间:11/16/2023 访问量:31
如何为某个包含空格的 apache 请求返回 404?
How do I return 404 for a certain apache request that contains spaces?
问:
对于如下所示的 url(使用 .htaccess)返回 404 的简单/可靠的方法是什么?
/foo/my file name.jpg
随着时间的推移,我应该能够在 .htaccess 中阻止更多的 url,所以之前对它们进行 url 编码并不容易,那里的文件名可能很长很复杂。 我认为包含带引号的文件名的规则/条件会更可靠。
我有这个,它似乎有效,但我读到你不能一起使用?!404
redirect
Redirect 404 "/foo/my file name.jpg"
我可以对我的 404.php 做一个,但是这样引用它不起作用,应该怎么做?RewriteRule
RewriteRule "/foo/my file name.jpg" 404.php [QSA]
答:
-1赞
BareNakedCoder
11/13/2023
#1
在第一个 arg 中,是与 perl 兼容的正则表达式。因此,请尝试将任何内容与至少一个空格字符匹配RewriteRule
RewriteRule ^.*?\s.*$ 404.php [QSA]
^
匹配开头,不贪婪地匹配零个或多个字符,匹配一个空格字符,匹配 zeror 或多个字符,并匹配结尾。空格字符可以是文件名的第一个字符、中间字符或最后一个字符。.*?
\s
.*
$
查看 https://regex101.com/r/Cznmkp/1
评论
1赞
Stephen Ostermiller
11/13/2023
我不认为他们想为所有带有空格的 URL 提供 404,而只是为一些带有空格的特定 URL 提供 404。我也不认为空间是他们的规则不起作用的原因。
0赞
adrianTNT
11/14/2023
是的,我只想为某些给定的 URL 返回 404(没有所有带空格的 url),它应该很简单,所以我可以添加更多而无需过多地更改 url(例如转义特殊字符等)
0赞
Stephen Ostermiller
11/13/2023
#2
如果有效,您的规则就可以了。mod_alias文档说,你可以以这种方式使用像 404 这样的状态代码。Redirect 404 "/foo/my file name.jpg"
重写规则中的空格可能不是该规则的问题。还有其他问题:
- 如果您的重写规则在 中,则不应以斜杠开头。只有 conf 文件中的规则以斜杠开头。或者将斜杠设置为可选(使用 ),以便它在任一位置都有效。
.htaccess
/etc/
/?
- 您应该使用 start () 和 end () 锚点,以便您的重写规则完全匹配,而不仅仅是“包含”规则。
^
$
- 您应该对文本句点 () 进行转义,因为未转义时,句点是正则表达式中的通配符。
\.
- 您应该使用该标志来表示此规则是最后一条规则,并且后续重写规则也不应也适用。
L
- 此规则应排在最前面,然后于可能与它冲突的其他规则。
RewriteRule "^/?foo/my file name\.jpg$" 404.php [QSA,L]
如果空格最终也是一个问题,您可以通过以下方式转义它们:\s
RewriteRule "^/?foo/my\sfile\sname\.jpg$" 404.php [QSA,L]
评论
0赞
adrianTNT
11/14/2023
你知道我提到的那个是不是错的吗? 因为如果我必须更改 url、转义字符等,对于许多 url 来说会变得有点复杂。Redirect 404 "/foo/my file name.jpg"
0赞
Stephen Ostermiller
11/14/2023
我的猜测是因为你有一些重写规则。mod_alias和mod_rewrite通常不能很好地协同工作。一旦你有了声明文件路径的重写规则(如前端控制器),你通常不能对它使用指令。Redirect
0赞
adrianTNT
11/15/2023
澄清一下,我上面提到的那个确实很完美,只是问这是否由于某种原因不正确。Redirect 404 "/foo/my file name.jpg"
1赞
Stephen Ostermiller
11/15/2023
如果它有效,那完全没问题。httpd.apache.org/docs/2.4/mod/mod_alias.html#redirect 说你可以以这种方式使用状态代码。404
0赞
adrianTNT
11/15/2023
哎呀,是的,我现在刚刚在文档中看到,您可以使用类似(消失)的东西,并且它说在这种情况下忽略最后一个(目标)url,太完美了。410
Redirect 410 "/foo"
评论