如何解决在 .htaccess 中结合 RewriteRules 以便忽略特定的查询参数
我正在尝试编写一些 RewriteRules,以便当请求包含特定查询参数时,我们将其称为 foo
,它会被完全忽略(删除)。这样做的原因是我需要在另一个 RewriteRule 内部使用 foo
,以便我可以将信息传递给我的前端控制器。如果 foo
已经存在,应用程序将无法按预期工作。我尝试了多种解决方案,例如 this 一个,但这并不能达到我想要的效果。到目前为止,我尝试了以下操作:
<IfModule mod_rewrite.c>
RewriteEngine On
# Remove possible existing query parameter called 'foo'
RewriteCond %{QUERY_STRING} ^(.*)&?foo=[^&]+&?(.*)$ [NC]
RewriteRule ^(.*)$ /$1?%1%2 [R=301,L]
# Lead every page/API request to index.PHP
RewriteCond $1 !\.(svg|jpg|png|webp|ico|css|js|ttf|woff|woff2)$
RewriteRule ^(.*)$ index.PHP?foo=$1 [L,QSA]
</IfModule>
基本上,每个不以所列文件扩展名之一结尾的请求都应该传递给我的前端控制器。没有第 5 行和第 6 行,只要原始请求中不存在 foo
查询参数,一切都可以正常工作。
有没有办法在不影响其他 RewriteRule 的情况下删除 foo
参数(或者只是在第二部分覆盖它)?提前致谢!
编辑
澄清几点:在我的应用程序中,前端控制器是一个 PHP 脚本,它采用重写的 GET 参数 foo
,其中包含最初请求的 URL。但是,如果用户将 foo
添加到请求中,我必须确保这不是传递给前端控制器的 foo
参数,因为那时应用程序将无法正常工作。
例如:如果客户端请求 https://example.com/something?foo=123&bar=456
,则该请求应该重定向到 https://example.com/something?bar=456
(或者根本不重定向)和第 9 行中的查询参数 foo
,即仅适用于我的前端控制器,应为 https://example.com/something
,bar
未更改。不幸的是,上面的代码不会这样做。相反,我被重定向到 https://example.com/index.PHP?bar=456
。我想解决方案实际上很简单,但我不知道如何去做。
解决方法
您可以尝试以下操作吗?请确保在测试您的 URL 之前清除浏览器缓存。考虑到这里,您需要在查询字符串中 &
之后的所有内容在此处通过重写的 URL 传递。从 OP 的 htaccess 文件中添加了 2 条现有规则,并将 https 规则的更改位置移至第一位。
RewriteEngine ON
##From OP's comments adding these here,http --> https should come first.
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
# Remove possible existing query parameter called 'foo'
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^(.*)&?foo=[^&]+&?(.*)$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}?%1%2 [NE,L]
# Lead every page/API request to index.php
RewriteCond $1 !\.(svg|jpg|png|webp|ico|css|js|ttf|woff|woff2)$
RewriteRule ^(.*)$ index.php?foo=$1 [L,QSA]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。