友好的mod_rewrite用于包含多个术语的搜索URL

时间:2013-09-11 10:43:53

标签: regex apache .htaccess mod-rewrite

我正在寻找一种在用户搜索我的网站时提供友好网址的方法。我目前有一个半功能选项,但它只适用于一个搜索词。我希望能够尽可能多地添加搜索字词。

我的网址设置如下:

http://www.mydomain.com/tutorial/usersearch=word/sort=1

在.htaccess中使用以下正则表达式:

# Rewrite rule for the tutorial 'page selection' links
RewriteRule ^tutorial/page([0-9]+)$ tutorial.php?page=$1
RewriteRule ^tutorial/page([0-9]+)/usersearch=([A-Za-z_%20+-]+)$ tutorial.php?page=$1&usersearch=$2
RewriteRule ^tutorial/page([0-9]+)/usersearch=([A-Za-z_%20+-]+)/sort=([0-9]+)$ tutorial.php?page=$1&usersearch=$2&sort=$3
RewriteRule ^tutorial/usersearch=([A-Za-z_-]+)(/sort=([0-9]+))?$ tutorial.php?usersearch=$1&$2

上面代码的最后一行是指我正在尝试创建的友好搜索网址。 / sort = integer部分也是可选的。 在输入搜索字词并点击提交按钮后,以下内容会添加到不友好的网址“& submit = Search”中,因此我不知道是否应该将其作为一个选项加入?

以上.htaccess正则表达式有效,但只有一个搜索词。

'http://www.mydomain.com/tutorial/usersearch=word/sort=3' - 这有效,但是只要在'word'之后添加空格,网址就会失败并且您会收到404错误。我试过添加()?,(%20)?对于可选空间,但它甚至在那里失败。我已经尝试在第一个字符类中添加一个空格,但这完全失败了。

我确信有一种方法可以将上述所有这些重写分组,但我失败了。 知道如何修改我的正则表达式,这样我就可以匹配几个搜索词吗?

谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

匹配空格的正则表达式不正确:

[A-Za-z_-]

仅匹配大写/小写字母ascii字母下划线和连字符。

将规则更改为抓住空格:

RewriteRule ^tutorial/usersearch=([^/]+)(?:/(sort=[0-9]+))?$ index.php?usersearch=$1&$2 [L,QSA,NC]