htaccess如何在url重写后访问/获取搜索参数

时间:2015-10-09 11:02:19

标签: php html forms .htaccess

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

单个参数网址://thesite.com/search?keyword=sample+text

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

在我的htacess中,我有一个简单的重写规则,正在寻找搜索:

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)

用于生成网址的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

我可以根据&amp;分拆字符串。和=并用空格替换+。

为什么没有包含参数的任何想法?

非常感谢

更新:应用案例1

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

我的apache日志报告以下内容:

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

什么是不正确的?我试过删除?从重写规则,我用/作为提供的样本替换它。我修改了html以包含/之后。当我这样做时,在apache日志中报告了以下内容:

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

额外的HTACCESS INFO

我已经应用了以下内容

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

我有一堆其他的RewriteRule用于其他功能齐全的网址。这是我的第一个查询字符串,它让我难倒。

UPDATE2

尝试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]

2 个答案:

答案 0 :(得分:3)

使用RewriteRule上的[QSA]标志

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

这是文档

  

修改查询字符串   默认情况下,查询字符串将保持不变。但是,您可以在包含查询字符串部分的替换字符串中创建URL。只需在替换字符串中使用问号,即表示应将以下文本重新注入查询字符串。如果要删除现有查询字符串,请仅使用问号结束替换字符串。要组合新旧查询字符串,请使用[QSA]标志。

答案 1 :(得分:2)

使用RewriteCond 我们习惯使用RewriteRule来匹配URL,然后重写它。但是,RewriteRule将始终忽略您的查询字符串(GET数据),因此我们需要使用RewriteCond来捕获查询字符串中的值。

这是语法:

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

    因此,组合它们,(.*)匹配任何字符 所以,显然,在这个例子中,它匹配整个查询字符串部分。 捕获查询字符串的一些常用方法

案例1

如果您以这种方式重写了URL,则适用于您的情况,例如: 从site.com/show.php?id=seosite.com/show/seo/

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

这是htaccess规则:

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

此RewriteCond将整个查询字符串(第一个括号)捕获到%1 在这种情况下,捕获的字符串%1是“lang = en&amp; source = firefox” 然后,我们执行正常的网址重写,并在符号(%1)之后将&附加到网址。

案例2

如果您具体了解或想要控制要使用的查询字符串,则本案例适用于您。

例如,您只想匹配lang=xxx NOTHING ELSE ,例如: 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”。

Useful Link to Apache mod rewrite