如何为某个包含空格的 apache 请求返回 404?

How do I return 404 for a certain apache request that contains spaces?

提问人:adrianTNT 提问时间:11/13/2023 更新时间:11/16/2023 访问量:31

问:

对于如下所示的 url(使用 .htaccess)返回 404 的简单/可靠的方法是什么?

/foo/my file name.jpg

随着时间的推移,我应该能够在 .htaccess 中阻止更多的 url,所以之前对它们进行 url 编码并不容易,那里的文件名可能很长很复杂。 我认为包含带引号的文件名的规则/条件会更可靠。

我有这个,它似乎有效,但我读到你不能一起使用?!404redirect

Redirect 404 "/foo/my file name.jpg"

我可以对我的 404.php 做一个,但是这样引用它不起作用,应该怎么做?RewriteRule

RewriteRule "/foo/my file name.jpg" 404.php [QSA] 
apache .htaccess 重定向 url-rewriting http-redirect

评论


答:

-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,太完美了。410Redirect 410 "/foo"