Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex mod_用编码的新行(%0A)重写正则表达式规则_Regex_Apache_.htaccess_Mod Rewrite_Urlencode - Fatal编程技术网

Regex mod_用编码的新行(%0A)重写正则表达式规则

Regex mod_用编码的新行(%0A)重写正则表达式规则,regex,apache,.htaccess,mod-rewrite,urlencode,Regex,Apache,.htaccess,Mod Rewrite,Urlencode,我觉得mod_重写规则不匹配时遇到了一些问题 规则如下: RewriteRule ^api/(.*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA] 示例url为: http://ourdomain.tld/api/aaaaa/bbbb/cccc%0Adddd.json 只要url中没有$0A(据我所知),此规则就可以正常工作 我意识到,除了

我觉得mod_重写规则不匹配时遇到了一些问题

规则如下:

RewriteRule ^api/(.*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA]
示例url为:

http://ourdomain.tld/api/aaaaa/bbbb/cccc%0Adddd.json
只要url中没有
$0A
(据我所知),此规则就可以正常工作

我意识到,
除了新行之外,它还意味着其他任何东西,我尝试了以下规则来绕过新行或百分比符号,因为我不太确定mod_rewrite看到它时它的格式,但没有一个有效:

RewriteRule ^api/([.\s]*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA]


RewriteRule ^api/([.\%]*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA]


RewriteRule ^api/([.%]*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA]
奇怪的是,即使在没有
%
符号的URL上,以下内容也会失败:

RewriteRule ^api/([.]*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA]
如果有人能为我解释一下这一点,我将非常感激,因为我不能真正改变API的工作方式(即我不能将其进行base64编码等),并且需要在其中添加一行新行来获取它的值

我已经在进行了测试,他们的工具认为它应该可以工作

编辑:

/api/something/sent+40.06K+bytes++received+7.83M+bytes++542.70K+bytes%2Fsec%0Atotal+size+is+19.83G++speedup+is+2520.16+%28Completed+in+14+seconds%29.json
我们为上面的URL提供了一个解决方案,但它不适用于以下示例:

/api/something/sent+40.06K+bytes++received+7.83M+bytes++542.70K+bytes%2Fsec%0Atotal+size+is+19.83G++speedup+is+2520.16+%28Completed+in+14+seconds%29.json
谢谢

..并需要获得一个带有换行符的值

您缺少插入符号
^
被认为是字符类中的否定运算符
[^.]

RewriteRule ^api/([^.]*)\.(json|xml|csv|txt|printr|basictxt)$ api/endpoint.php?api_request=$1&api_response_type=$2 [QSA]

请参见演示

谢谢您的回答。这似乎确实有效,但我有点困惑。插入符号不是指除组中的字符以外的任何字符。也就是说,
[A-Z]
将匹配任何大写字母,
[^A-Z]
除了大写字母以外的任何字符?所以肯定
[^.]
意味着只匹配新行(或其他不匹配的东西本身)。无论如何,你的答案似乎已经成功了,所以谢谢你。实际上这里的意思是匹配所有东西直到一个点
,然后匹配点
\。
它否定了
“除了一个点以外的任何东西”
。谢谢,我刚刚尝试了一些更真实的值,这些值将被发送到API,其中一些确实包含点(因此失败),然后我看到您使用
[\S\S]
进行编辑,我在下一个字符串中尝试了这些值,但它不起作用。regex101我觉得应该是这样,你能帮忙吗?对不起,如果我不清楚,我可以用regex101。我给您的regex101链接说正则表达式与输入匹配,但在我的.haccess文件中它不匹配。regex101使用的是regex的PCRE(PHP)风格,显然mode_rewrite使用的是其他东西。请尝试删除此处的
^
锚定
RewriteRule api/(.*)\(json | xml | csv | txt | printr | BasicText)$…
mod|U rewrite对换行符(以及其他编码的特殊字符,如斜杠)不确定。匹配它们的一种方法是使用转义序列:
\x0A
是换行符的十六进制表示形式。常见的构造是
[\x00-\xff]
,字面意思是“任何字节”,您可以尝试使用它,如
重写规则api/([\x00-\xff])*?\(json | xml | csv | txt | printr | BasicText)$
注意懒星。我现在无法测试,但可能值得一试。@Sát,谢谢。我试过了,但又没成功!一定有办法让它运转起来。