Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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 否定正则表达式在重写规则中不起作用_Regex_Apache_Mod Rewrite - Fatal编程技术网

Regex 否定正则表达式在重写规则中不起作用

Regex 否定正则表达式在重写规则中不起作用,regex,apache,mod-rewrite,Regex,Apache,Mod Rewrite,我正试图为mod_重写编写规则。我需要将以“/api/v[0-9.]+/app/[a-z]+/”开头的所有请求重定向到app.php,并为其他请求发送400个错误请求重定向 说: 在mod_中重写!字符可以在正则表达式之前使用 否定它。也就是说,字符串将被视为已匹配 仅当它与表达式的其余部分不匹配时 所以,我试过: RewriteEngine on RewriteBase / RewriteRule ^api/v[0-9.]+/app/[a-z]+/ app.php [L] RewriteRul

我正试图为mod_重写编写规则。我需要将以“/api/v[0-9.]+/app/[a-z]+/”开头的所有请求重定向到app.php,并为其他请求发送400个错误请求重定向

说:

在mod_中重写!字符可以在正则表达式之前使用 否定它。也就是说,字符串将被视为已匹配 仅当它与表达式的其余部分不匹配时

所以,我试过:

RewriteEngine on
RewriteBase /
RewriteRule ^api/v[0-9.]+/app/[a-z]+/ app.php [L]
RewriteRule !^api/v[0-9.]+/app/[a-z]+/ - [R=400]
如果我使用这个,每个请求都会收到400个错误请求

我也试过:

RewriteRule ^api/v[0-9.]+/app/[a-z]+/ app.php [S=1]
RewriteRule !^api/v[0-9.]+/app/[a-z]+/ - [R=400]

我每次都会收到400个错误的请求

看起来最后一条规则总是有效的。我不明白为什么

我试过这个:

RewriteRule ^api/v[0-9.]+/app/[a-z]+/ app.php [L]
RewriteRule !^a - [R=400]
它工作正常。每一个不是以“a”开头的请求,我都会收到400个错误请求,重定向到app.php也可以。但是如果我在规则中添加了一些东西,它就不再起作用了

RewriteRule ^api/v[0-9.]+/app/[a-z]+/ app.php [L]
RewriteRule !^api - [R=400]
这一个不起作用(每次请求都有400个错误请求)


我不明白~^a和~^api之间有什么区别。

您需要排除
app.php
文件,否则您的规则也会将其映射到
400
错误

RewriteEngine on
RewriteBase /
RewriteRule ^api/v[0-9.]+/app/[a-z]+/ app.php [L]
RewriteCond %{REQUEST_URI} !app\.php [NC]
RewriteRule !^api/v[0-9.]+/app/[a-z]+/ - [R=400]

您在所有URI上看到
400
bed请求的原因是,您的第一条规则匹配与模式
^api/v[0-9.]+/app/[a-z]+/
匹配的所有请求,并将URI重写为
app.php
。您的web服务器再次读取htaccess文件,以便为
app.php
服务,并且您的第二条规则匹配,
app.php
被重写为
R=400

谢谢您的回答和解释,现在我明白了它的工作原理。@sab欢迎您!很高兴我能帮上忙,干杯。
RewriteEngine on
RewriteBase /
RewriteRule ^api/v[0-9.]+/app/[a-z]+/ app.php [L]
RewriteCond %{REQUEST_URI} !app\.php [NC]
RewriteRule !^api/v[0-9.]+/app/[a-z]+/ - [R=400]