当 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/one 或 mydomain.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 开头