在 HTaccess 中将QUERY_STRING参数与正则表达式匹配的参数合并


merge QUERY_STRING params with a regex matched param in htaccess

我有一个.htaccess文件,它像这样重定向URL:

RewriteRule    ^companies/([0-9]{1,20})/(.*)/?$    /php/company-profile.php?id=$1    [NC,L]

它匹配 URL "companies/12345/company-name-safe"并获取公司简介的唯一 id.php。

这很好用。但我在页面上列出了该公司的工作列表,该列表具有分页和order_by功能。

所以我还需要捕获任何额外的 URL 参数并传递给 php 文件。

例如,对于网址:companies/12345/company-name?page=2&order_by=date+DESC

如果可能的话,我不想改变我的 URL 结构,我总是希望第 1 页是一个干净的 URL,末尾没有"?id=12345"。

我该怎么做?

您只需在规则中添加QSA标志即可

RewriteRule ^companies/([0-9]{1,20})/(.*)/?$ /php/company-profile.php?id=$1 [NC,L,QSA]

这样,将追加查询字符串。从您的示例中,companies/12345/company-name?page=2&order_by=date+DESC将被重写为 /php-profile.php?id=12345&page=2&order_by=date+DESC .

仅当查询字符串参数在规则中具有相同的名称时,上述解决方案才有效。否则,您可以使用%{QUERY_STRING}上的RewriteCond单独捕获它们,然后手动将它们附加到规则中,例如:

RewriteCond %{QUERY_STRING} ^page=([^&]+)&order_by=([^&]+)$ [NC]
RewriteRule ^companies/([0-9]{1,20})/(.*)/?$ /php/company-profile.php?id=$1&xxx_page=%1&xxx_order_by=%2 [NC,L]  

请注意,在当前情况下,您不再需要QSA标志