我有一个基于提交表单的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=xxx
和time=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数据(第一个括号)到
- 这个RewriteCond也捕获时间的GET数据(第二个括号)到
%2
-
'w
匹配单词字符 -
'd
匹配小数 - +
+
表示出现一次或多次
%1
在此例中,捕获的字符串%1
为" en ", %2
为"100"。
Apache mod重写链接