【问题标题】:Rewrite URL empty values in query string - Double slashes, Optional Parameters重写查询字符串中的 URL 空值 - 双斜杠,可选参数
【发布时间】:2015-02-26 06:38:30
【问题描述】:

我环顾四周并尝试了自己,但无法解决。

这是申请重写前的网址:

http://example.com/job-search/?searchText=GOOGLE+INC.&searchCity=Enter+US+City+or+Zipcode&searchYear=14&action=search&searchJobTitle=Enter+Job+Title+%2F+Role+Name

这是应用以下重写规则后的 URL:

http://example.com/job-search/GOOGLE-INC./Enter-US-City-or-Zipcode/14/search/Enter-Job-Title 

我在 .htaccess 中有以下规则。当我拥有上面所有字段的 URL 时,它运行良好。

RewriteEngine On
RewriteBase /job-search/

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(.*?)(?:\+|%20|\s)+(.+?)\sHTTP [NC] 
RewriteRule ^ /%1-%2 [L,NE,R]

RewriteCond %{THE_REQUEST} \?searchText=([^\s&]+)&searchCity=([^\s&]+)&searchYear=(\d+)&action=([^\s&]+)&searchJobTitle=([^\s&]+) [NC]
RewriteRule ^ %1/%2/%3/%4/%5? [R=302,L,NE]

RewriteRule ^([^/]+)/([^/]+)/(\d+)/([^/]+)/([^/]+)/?$ ?searchText=$1&searchCity=$2&searchYear=$3&action=$4&searchJobTitle=$5 [NC,L,QSA]

当它获得空值时,重写失败。规则不起作用,我得到以下 URL。

http://example.com/job-search/?searchText=GOOGLE-INC.&searchCity=&searchYear=14&action=search&searchJobTitle=

在三个参数( searchText 或 searchCity 或 SearchJobTitle )中,一次只有一个参数有值,另外两个有空值。此外,只是想确保,当用户键入主页 URL 时,如 http://example.com/job-search/ ,它不应该失败(我尝试了一些东西但它失败了)。当它们为空时,也希望避免使用双斜线。

下面是我想看到的输出:

例如,当 searchCity 和 SearchJobTitle 为空时,输出 URL 应如下所示

http://example.com/job-search/GOOGLE-INC./14/search

当 searchText 和 searchCity 为空且 searchJobTitle 值为 'Applicaton-Engineer' 时,输出 URL 应如下所示

http://example.com/job-search/14/search/Application-Engineer

你能帮我找到正确的规则吗?感谢你的帮助 !

【问题讨论】:

  • 如果参数可以是可选的,您可能应该重新考虑您希望这些 URL 的外观,因为其中一些可能是空白的
  • @JonLin 目前,我正在检查 PHP,如果它们是空白或 null 并执行相应的操作。我已经添加了 URL 结构,如果它们是空白的以便澄清。
  • 不,我的意思是 URL 如:/A/B/C/D/E/F,如果其中任何一个是可选的,它看起来像:/A/B/D/F,那么你应该如何判断应该是哪个是“C”还是“E”?或者它们实际上是空白的?
  • @JonLin,好点子,我在想,当我提交表单时,REQUEST 对象会提到它被分配给哪个值,哪个值是空白,所以当我读取这些值时,它会为空白。我明白你的意思,当有人直接使用 URL 访问而不是提交表单时。我在想。有什么建议吗?

标签: .htaccess mod-rewrite url-rewriting


【解决方案1】:

把你的规则改成这样:

RewriteEngine On
RewriteBase /job-search/

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(.*?)(?:\+|%20|\s)+(.+?)\sHTTP [NC] 
RewriteRule ^ /%1-%2 [L,NE,R]

RewriteCond %{THE_REQUEST} \?searchText=([^\s&]+)&searchCity=&searchYear=(\d+)&action=([^\s&]+)&searchJobTitle=\s [NC]
RewriteRule ^ %1/%2/%3/? [R=302,L,NE]

RewriteCond %{THE_REQUEST} \?searchText=([^\s&]+)&searchCity=([^\s&]+)&searchYear=(\d+)&action=([^\s&]+)&searchJobTitle=([^\s&]+) [NC]
RewriteRule ^ %1/%2/%3/%4/%5? [R=302,L,NE]

RewriteRule ^([^/]+)/([^/]+)/(\d+)/([^/]+)/([^/]+)/?$ ?searchText=$1&searchCity=$2&searchYear=$3&action=$4&searchJobTitle=$5 [NC,L,QSA]

RewriteRule ^([^/]+)/(\d+)/([^/]+)/?$ ?searchText=$1&searchYear=$2&action=$3 [NC,L,QSA]

【讨论】:

  • 感谢@anubhava,它适用于场景一,当搜索文本不为空白而其他文本为空白时。但是当 searchCity 不为空白且其他两个为空白时,它会失败。我得到这个网址example.com/job-search/…
  • 你不应该在同一个问题中合并多个问题。我已经为您提供了有关如何处理空白值的答案。尝试自己为其他组合建立规则,如果遇到问题,请打开一个新问题。
  • 明白,谢谢!将尝试构建。
猜你喜欢
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2020-09-08
  • 2017-08-27
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多