【问题标题】:How to reject URLs whose query string begins with a hashtag?如何拒绝查询字符串以主题标签开头的 URL?
【发布时间】:2021-06-28 14:38:38
【问题描述】:

使用 mod_rewrite,我如何拒绝(通过返回 404)@​​987654321@ 以主题标签 (#) 开头的所有 URL?例如,这些 URL 都是我要拒绝的示例:

https://example.com/?#something
https://example.com/?#anything-else
https://example.com/?#i-don't-care-about-this-text

但是如果?后面的字符串以其他任何东西开头,或者根本没有查询字符串,我希望它通过。

我知道主题标签是一个片段标识符,主题标签后面的字符串不是您可以使用 mod_rewrite 处理的,但我希望主题标签本身会出现。所以我尝试了这样的规则来匹配:

RewriteCond %{QUERY_STRING} #
RewriteCond %{QUERY_STRING} "#"
RewriteCond %{QUERY_STRING} (#)
RewriteCond %{QUERY_STRING} -n
RewriteCond %{QUERY_STRING} ^$

但这些似乎都没有抓住它。您能否建议一种方法来检测和拒绝 QUERY_STRING 以井号标签开头的 URL?

更新:但是,如果对 https://example.com 的请求(没有 ?)它应该通过。

我尝试过的另一个想法是:

RewriteCond %{REQUEST_URI} ^\/\?$ 
RewriteCond %{QUERY_STRING} =""
RewriteRule ^ - [L,R=404]

我在这里要做的是说:如果REQUEST_URI 包含? 并且如果QUERY_STRING 为空,则重定向到404。但它将所有内容(包括具有非空查询字符串的URL)重定向到404.

【问题讨论】:

  • # 开头的片段不会发送到网络服务器,因此您不能在服务器端执行此操作
  • 在这种情况下,有没有办法检测到查询字符串基本上不包含任何内容?换句话说,如果“#something”对服务器不可见,这是否意味着服务器将查询字符串视为空?
  • 那为什么RewriteCond %{QUERY_STRING} -nRewriteCond %{QUERY_STRING} ^$ 没抓到呢?
  • 确实 RewriteCond %{QUERY_STRING} ^$ 应该匹配一个空的查询字符串。另请注意,REQUEST_URI 永远不能包含 ?

标签: .htaccess mod-rewrite url-rewriting


【解决方案1】:

您可以尝试使用此规则来检测没有查询字符串的?

RewriteEngine On

RewriteCond %{THE_REQUEST} \?\s
RewriteRule ^$ - [L,R=404]

【讨论】:

  • 我没想到正则表达式的空间。效果很好。虽然我仍然不确定为什么 RewriteCond %{QUERY_STRING} ^$ 在这种情况下不能按预期工作。
  • RewriteCond %{QUERY_STRING} ^$ 在两种情况下都为真,即example.com/example.com/?#something
猜你喜欢
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
相关资源
最近更新 更多