在 .htaccess 中合并 RewriteRules,以便忽略特定的查询参数

Combine RewriteRules in .htaccess so that a specific query parameter is ignored

我正在尝试编写一些 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%2 [R=301,L]

# Lead every page/API request to index.php
RewriteCond  !\.(svg|jpg|png|webp|ico|css|js|ttf|woff|woff2)$
RewriteRule ^(.*)$ index.php?foo= [L,QSA]

</IfModule>

基本上,每个不以列出的文件扩展名之一结尾的请求都应该传递到我的前端控制器。如果没有第 5 行和第 6 行,只要原始请求中不存在 foo 查询参数,一切都可以正常工作。

有没有办法只删除 foo 参数而不影响其他 RewriteRule(或者只是在第二部分覆盖它)?提前致谢!

编辑

只是澄清一些事情:在我的应用程序中,前端控制器是一个 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/somethingbar 未更改。不幸的是,上面的代码不会这样做。相反,我被重定向到 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 ^(.*)/$ / [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  !\.(svg|jpg|png|webp|ico|css|js|ttf|woff|woff2)$
RewriteRule ^(.*)$ index.php?foo= [L,QSA]