Htaccess如何访问/获得url重写后的搜索参数


htaccess how to access/get search parameters after a url rewrite

我有一个基于提交表单的htaccess重写规则。我正试图阅读搜索参数,这是关键字搜索的一个简单示例,但理想情况下最终将添加更多参数:

单参数url: //thesite.com/search?keyword=sample+text

2参数url: //thesite.com/search?keyword=sample+text&location=myCity

在我的haccess中,我有一个简单的重写规则查找搜索,如下所示:

RewriteRule ^.*search?(.*)$ /displayPage.php?page=search&options=$1

我像这样访问options参数:

$searchOptions = filter_input(INPUT_GET, "options")!==NULL?filter_input(INPUT_GET, "options"):'';

当我输出这个变量时,它什么都没有

我尝试了var_dump($_GET),结果是:

array (size=2)
  'page' => string 'search' (length=6)
  'options' => string '' (length=0)

用来生成url的html:

<form class="start-search" action="/search" method="get">
  <input id='keyword' name='keyword' class="search-str" type="text" value="" placeholder="Start Your Search">
  <!-- Meant to hold value for category -->
  <input class="search-cat" type="hidden" value="" placeholder="Start Your Search">
  <button class="btn" type="submit">
    <i class="fa fa-arrow-circle-o-right"></i>
  </button>
</form>

我期望$searchOptions包含以下内容:

单参数

: keyword=sample+text

用于多个参数:keyword=sample+text&location=myCity

我可以根据&和=并用空格替换+。

知道为什么没有包含参数吗?

非常感谢你

UPDATE: applied Case 1

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^search?(.*)/$ displayPage.php?page=search&%1

我的apache日志报告如下:

"GET /search?keyword=test+text HTTP/1.1" 404 286

什么是错误的?我试着把?在重写规则中,我将其替换为示例提供的a/。我修改了html,在它后面包含一个/。当我这样做时,apache日志中报告了以下内容:

"GET /search/?keyword=test+text HTTP/1.1" 301 329
"GET /search?keyword=test+text HTTP/1.1" 404 286

附加的HTACCESS信息

我已经应用了以下内容

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

我有一堆其他的RewriteRule的其他url都是功能性的。这是我的第一个查询字符串,这让我难倒了。

更新2

尝试Steve E. [QSA]

RewriteRule ^.*search?(.*)/$ displayPage.php?page=search&%1 [QSA]

Apache日志报告

 "GET /search?keyword=sample+search HTTP/1.1" 404 286

解决方案:Steve E提供的解决了上面的一个问题,在调用displayPage.php之前忘记了/。它适用于单个和多个参数。:)

RewriteRule ^.*search?(.*)/$ /displayPage.php?page=search&%1 [QSA]

在rewriterrule上使用[QSA]标志

RewriteRule ^search?(.*)/$ displayPage.php?page=search&%1 [QSA]

这里是docs

修改查询字符串默认情况下,查询字符串不变地传递。但是,您可以在包含查询字符串部分的替换字符串中创建url。只需在替换字符串中使用问号,以指示应将以下文本重新注入查询字符串中。当要擦除现有查询字符串时,请仅以问号结束替换字符串。要合并新旧查询字符串,请使用[QSA]标志。

使用RewriteCond我们习惯于使用RewriteRule来匹配URL,然后重写它。然而,RewriteRule将总是忽略你的查询字符串(GET数据),所以我们需要使用RewriteCond来捕获查询字符串中的值。

语法如下:

RewriteCond %{QUERY_STRING} ^(.*)$
  • %{QUERY_STRING}将匹配的查询字符串捕获到%变量。
  • %1将携带第一组括号匹配的内容。第二部分^(.*)$是要匹配的模式。
  • ^表示"以"
  • 开始
  • $表示"结束"
  • 像正则表达式一样,(.*)中的点匹配任何字符。
  • 括号内的星号*是一个量词,匹配0到无限次。

    因此,结合它们,(.*)匹配任何字符显然,在这个例子中,它匹配整个查询字符串部分。获取查询字符串

  • 的一些常用方法

案例1

这种情况是为你,如果你已经重写你的URL如下,例如:FROM site.com/show.php?id=seo TO site.com/show/seo/

并且你想要使用重写的URL传递或附加一些GET数据,例如:site.com/show/seo/?lang=en&source=firefox你希望它像site.com/show.php?id=seo&lang=en&source=firefox

那样追加

RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^show/(.*)/$ show.php?id=$1&%1

这个RewriteCond捕获整个查询字符串(第一个括号)到%1在本例中,捕获的字符串%1是" lang=en&source=firefox "然后,我们进行常规的URL重写,并将%1添加到与符号(&)之后的URL。

案例2

如果你明确地知道或者想要控制你将要使用的查询字符串,这个例子是为你准备的。

例如,只匹配lang=xxx,不匹配其他,例如:site.com/show/seo/?lang=en&more=1你希望它像site.com/show.php?id=seo&lang=en一样追加,忽略其他未知的查询字符串

RewriteEngine On
RewriteCond %{QUERY_STRING} ^lang=('w+)$
RewriteRule ^show/(.*)/$ show.php?id=$1&lang=%1
  • RewriteCond捕获lang的GET数据(第一个括号)到%1
  • 'w匹配单词字符
  • + +表示出现一次或多次
  • 在本例中,捕获的字符串%1是" en "

情况3

与案例2类似,但在这种情况下,我们有更多的查询要匹配。

例如,您只想匹配lang=xxxtime=000,例如:site.com/show/seo/?lang=en&time=100你想把它附加到site.com/show.php?id=seo&lang=en&time=100

RewriteEngine On
RewriteCond %{QUERY_STRING} ^lang=('w+)&time=('d+)$
RewriteRule ^show/(.*)/$ show.php?id=$1&lang=%1&time=%2
    这个RewriteCond捕获lang的GET数据(第一个括号)到%1
  • 这个RewriteCond也捕获时间的GET数据(第二个括号)到%2
  • 'w匹配单词字符
  • 'd匹配小数
  • + +表示出现一次或多次

在此例中,捕获的字符串%1为" en ", %2为"100"。

Apache mod重写链接