【发布时间】:2020-12-21 02:35:22
【问题描述】:
我正在尝试为 mod_rewrite 编写规则。我需要将所有以“/api/v[0-9.]+/app/[a-z]+/”开头的请求重定向到 app.php 并为其他请求发送 400 Bad Request redirect。
在 mod_rewrite 中!可以在正则表达式之前使用字符 否定它。也就是说,一个字符串将被认为是匹配的 仅当它与表达式的其余部分不匹配时。
所以,我试过了:
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 Bad Request。
我也试过了:
RewriteRule ^api/v[0-9.]+/app/[a-z]+/ app.php [S=1]
RewriteRule !^api/v[0-9.]+/app/[a-z]+/ - [R=400]
和
RewriteRule ^api/v[0-9.]+/app/[a-z]+/ app.php [L]
RewriteCond %{REQUIEST_URI} !^api/v[0-9.]+/app/[a-z]+/
RewriteRule !^api/v[0-9.]+/app/[a-z]+/ - [R=400]
我每次请求都会收到 400 Bad Request。
看起来最后一条规则总是有效的。我不明白为什么。
我试过这个:
RewriteRule ^api/v[0-9.]+/app/[a-z]+/ app.php [L]
RewriteRule !^a - [R=400]
它工作正常。对于每个不以“a”开头的请求,我都会收到 400 Bad Request,重定向到 app.php 也可以。但是如果我在规则中添加一些东西,它就不再起作用了。
RewriteRule ^api/v[0-9.]+/app/[a-z]+/ app.php [L]
RewriteRule !^api - [R=400]
这个不起作用(每个请求再次出现 400 Bad Request)。
我不明白~^a 和~^api 有什么区别。
【问题讨论】:
标签: regex apache mod-rewrite