我有一个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]
答案 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=seo
到site.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
%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
%1
%2
\w
匹配单词字符\d
匹配小数+
表示一次或多次在这种情况下,捕获的字符串%1
为“en”,%2
为“100”。