我有一个 GET 请求
http://www.example.com/index.php?location=location&category=category&keyword=any+keyword
我已将此 URL 转换为
http://www.example.com/location/category/any+keyword
但问题是我的 URL 一直在变化。
如果用户只输入一个关键字,那么 URL 就会像
http://www.example.com/any+keyword
,我只需要在标题和描述中搜索。如果用户只输入一个类别,URL 就会像我一样
http://www.example.com/category
,我只需要在该类别中搜索。如果用户输入位置和关键字,URL 将会类似
http://www.example.com/location/any+keyword
,我只需要在位置、标题和描述中进行搜索,反之亦然。
... 任何帮助将不胜感激。
答案1
如果关键字参数中确实有“+”号,你也许可以这样做。你总是需要有一些独特的模式:
RewriteRule ^(.+\+.+)/?$ index.php?keyword=$1 [NC,L]
RewriteRule ^(.+)/?$ index.php?category=$1 [NC,L]
RewriteRule ^(.+)/(.+\+.+)/?$ index.php?category=$1&keyword=$2 [NC,L]
RewriteRule ^(.+)/(.+)/(.+\+.+)/?$ index.php?location=$1&category=$2&keyword=$3 [NC,L]
如果不是每次都有“+”号,而它可能只是一个普通字符串,那么这是不可能的,因为关键字和类别具有相同的正则表达式模式。
答案2
听起来,URL 可以由“location”、“category”和/或“any+keyword”的任意组合组成?(虽然您的示例没有明确表明“category”和“any+keyword”会一起使用?这样可以减少歧义一点点。
除非“位置”、“类别”(和“任何+关键字”)值之间存在明显差异,或者不同位置和类别足够小,您能够在指令中实际列出(硬编码)它们,那么没有办法单独处理这些 URL 差异.htaccess
。它们是模糊的。
如果可能的“位置”和“类别”值是唯一的,那么你也许可以重写后端应用程序的 URL,然后应用程序执行必要的查找以确定它是否是“位置”、“类别”(即“关键字”)。但这可能涉及更多工作(如计算能力) 并且不可扩展,因此不推荐。
实际上,鉴于您的示例 URL,从中可以得出的唯一可能有效的 URL 是:
http://www.example.com/location
http://www.example.com/location/category
http://www.example.com/location/category/any+keyword
但问题是我的网址一直在变化
您的应用程序在发生变化?还是入站链接?如果是前者,那么您需要解决应用程序中的歧义并创建一致的 URL 结构。