设置
我们的 HTTP/web 服务器上有以下目录结构:
/questions/who?/
/questions/what?/
/happy? part. 01/
/happy? yet?/
/happy? yet? again? really?!/
题我的问题:是否可以正确解析带有未转义/未编码问号(
?
)的相应 URI/URL?例如网址 http://test.org/happy? part. 01/
将解析为 /happy? part. 01/
在服务器上。由于 ?
表示查询字符串,这对我来说是一个问题。背景调查
正如预期的那样,Apache 默认处理第一个
?
作为查询字符串的开头。所以开箱即用的 URL 是 http://test.org/happy? part. 01/
将转换为 URI 路径 /happy
和查询字符串 part.01/
,由于路径 /happy
导致 404不存在。我在研究中发现的大多数其他答案/提示主要涉及重写 URL,假设
?
表示查询字符串,例如但是,在这种情况下 我们可以假设我们的 HTTP 服务器不会接收带有查询字符串的 URL .
我意识到通常浏览器/等。将在将 URI 发送到服务器之前对其进行编码(例如
http://test.org/happy? part. 01/
将作为 http://test.org/happy%3F%20part.%2001/
发送到服务器,尽管哪些字符被编码 depends on the app 以及它们对哪个 URI 标准版本的支持:RFC2396 或 RFC3986 )。但是对于这种情况,服务器可能会获得未编码的 URL,但不会获得任何带有查询字符串的 URL。我的尝试
起初我认为这样的简单规则就足够了:
RewriteRule ([^\?]*?)\?([^\?]*?) $1\?$2 [NE,N]
在这里,我试图反复找到所有 ?
s 并简单地将它们重新插入到未转义的 URL 中。不幸的是,正则表达式(以及许多变体)与包含 ?
的 URL 不匹配。 ,而是只匹配编码的 ?
值(value) %3F
.即使匹配,第二个捕获组 $2
似乎永远是空的。最后,\?
在替换字符串中似乎阻止了它被写入后的任何内容。上面链接的解决方案让我发现要检查
?
我不得不检查 %{THE_REQUEST}
变量,因为 Apache 将删除其他服务器变量/RewriteRules 的查询字符串。为此,我尝试了以下变体:RewriteCond %{THE_REQUEST} ^[A-Z]+\ \/([^\?]*?)\?([^\?]*?)\/?\ HTTP
RewriteRule ^(.*?)\?(.*?)$ $1\?$2 [NE,N]
而RewriteCond
的正则表达式正在将 URI 与 ?
匹配, %2
在 RewriteRule
导致 Internal Server Error
,尽管没有它,我似乎无法访问 ?
之后的 URL 部分。 .最后,我还用
%{QUERY_STRING}
尝试了各种方法和 [QSA]
但仍然没有运气。谢谢参观。
最佳答案
简单地说:
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{QUERY_STRING} !^$
RewriteRule ^(.*)$ /$1\%3F%{QUERY_STRING} [L,NE]
编辑:
尝试这个:
RewriteCond %{QUERY_STRING} ^(.*)\?(.*)$
RewriteRule ^(.*)$ /$1?%1\%3F%2 [L]
RewriteCond %{QUERY_STRING} !^$
RewriteRule ^(.*)$ /$1\%3F%{QUERY_STRING}? [L,NE]
关于apache - 允许在 URL/URI w/o 编码中使用非查询问号 "?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28503413/