【问题标题】:Negated regex does not work in RewriteRule否定的正则表达式在 RewriteRule 中不起作用
【发布时间】:2020-12-21 02:35:22
【问题描述】:

我正在尝试为 mod_rewrite 编写规则。我需要将所有以“/api/v[0-9.]+/app/[a-z]+/”开头的请求重定向到 app.php 并为其他请求发送 400 Bad Request redirect。

Mod_rewrite documentation 说:

在 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


    【解决方案1】:

    您需要排除您的 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 床请求的原因是因为您的第一条规则匹配任何匹配模式 ^api/v[0-9.]+/app/[a-z]+/ 的请求并将 URI 重写为 app.php 。您的网络服务器再次读取 htaccess 文件以提供 app.php 并且您的第二条规则匹配,app.php 被重写为 R=400

    【讨论】:

    • 感谢您的回答和解释,它有效,现在我明白它是如何运作的了。
    • @Saband 欢迎您!很高兴我能帮上忙,干杯。
    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多