当 REQUEST_URI 不以不同的模式开头时,Htaccess 重写规则不起作用

Posted

技术标签:

【中文标题】当 REQUEST_URI 不以不同的模式开头时,Htaccess 重写规则不起作用【英文标题】:Htaccess rewrite rule not working when REQUEST_URI does not start with different pattern 【发布时间】:2022-01-18 01:49:53 【问题描述】:

我正在尝试重定向任何不以特定模式开头的请求。

例如

mydomain.com/test/one/a

mydomain.com/test/one/b

mydomain.com/用户/名称/a

mydomain.com/用户/名称/b

因此,任何与 mydomain.com/test/onemydomain.com/user/name 不匹配的请求都会重定向到某个页面或网址。

到目前为止,我可以匹配以下内容

RewriteCond %REQUEST_URI ^(/test/one|/user/name) [NC]

RewriteRule .* - [F]

所以任何以 /test/one 或 /user/name 开头的 url 都可以正确重定向。

但是当我试图 用 ! 否定条件时,它会重定向每个请求!

RewriteCond %REQUEST_URI !^(/test/one|/user/name) [NC]

RewriteRule .* - [F]

但我希望所有请求都重定向,除了 REQUEST_URI 具有类似的模式 ^(/test/one|/user/name)

【问题讨论】:

【参考方案1】:

不需要RewriteCond,只需将模式提供给RewriteRule,例如

RewriteRule ^test/one - [F]
RewriteRule ^user/name - [F]

这将forbid 请求,以/test/one/user/name 开头。


要重写对某个网页的所有其他请求,请附加另一个 RewriteRule

RewriteRule ^ /some/web/page.html [L]

要重定向客户端而不是重写,请将标志 R|redirect 添加到规则中

RewriteRule ^ /some/web/page.html [R,L]

【讨论】:

【参考方案2】:

使用您显示的示例,请尝试遵循 htaccess 规则文件。请确保在测试您的 URL 之前清除您的浏览器缓存。

在这里使用THE_REQUEST 变量让 apache 检查条件。

RewriteEngine ON
RewriteCond %THE_REQUEST !\s/(?:test/one/|user/name/)\S+\s [NC]
RewriteRule ^ - [F,L]

【讨论】:

以上是关于当 REQUEST_URI 不以不同的模式开头时,Htaccess 重写规则不起作用的主要内容,如果未能解决你的问题,请参考以下文章

jhipster Keycloak 在 DEV 模式下不以 docker-compose 开头

不以元音开头或结尾的单词的正则表达式?

sonar V.4.3.1 不以 postgresql 开头

如何使用正则表达式匹配不以某些字符开头或结尾的单词?

如何消除可能以或不以 www 开头的“重复”URL MySQL 行?

删除CSV文件中不以python中的数字开头的所有行