【发布时间】: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} -n或RewriteCond %{QUERY_STRING} ^$没抓到呢? -
确实
RewriteCond %{QUERY_STRING} ^$应该匹配一个空的查询字符串。另请注意,REQUEST_URI永远不能包含?
标签: .htaccess mod-rewrite url-rewriting