【问题标题】:custom regex redirect in htaccesshtaccess 中的自定义正则表达式重定向
【发布时间】:2014-03-23 23:56:10
【问题描述】:

我的旧网站结构有按年份组织的城市网址,如下所示:

.. 我需要将所有这些重定向到这个新网址:

我可以通过以下方式获取文件夹:

RewriteEngine On
RewriteRule ^2010/(.+?)(-[0-9]+)?$ /cities/$1 [L,R=301]
RewriteRule ^2011/(.+?)(-[0-9]+)?$ /cities/$1 [L,R=301]
RewriteRule ^2012/(.+?)(-[0-9]+)?$ /cities/$1 [L,R=301]
RewriteRule ^2013/(.+?)(-[0-9]+)?$ /cities/$1 [L,R=301]

但它当然会导致 404,因为文件名并不完全相同。

我这里看到的模式是获取OLD url(san-francisco)的前两个单词,并手动提供新的URL,pseduo-code:

if found san-francisco redirect /cities/san_francisco_ca
if found honolulu redirect /cities/honolulu_hi

...但我不确定如何编写如此复杂的正则表达式。

【问题讨论】:

  • 你有多少个城市?如果它是一个很大的数字,首先将所有重定向映射到城市字符串是最容易的。如果只有 10 个,那么您可以手动执行此操作,并且要编写正则表达式,我们需要知道您所写的所有城市……通常我会编写一些 SQL 查询,然后从这些结果中生成正则表达式。
  • 您的网址中有san-francisco,但您想重定向到san_francisco_ca 注意ca 部分不存在。你的正则表达式如何匹配整个 san-francisco-details.html
  • @Nimbuz 如果你能给出 20 个城市,然后我们会转到你需要的正则表达式。
  • @abc123 当然,这些是新城市名称:pastebin.com/0Yn4gcJC
  • @abc123 2012年城市列表为例:pastebin.com/UqVTHcdx

标签: php regex wordpress .htaccess


【解决方案1】:

htaccess 的重定向代码

RewriteEngine On
RewriteRule ^201\d/(san)-(antonio).*\.html$ /cities/$1_$2_tx [L,R=301,NC]
RewriteRule ^201\d/(phoenix).*\.html$ /cities/$1_az [L,R=301,NC]
RewriteRule ^201\d/(honolulu).*\.html$ /cities/$1_hi [L,R=301,NC]
RewriteRule ^201\d/(houston).*\.html$ /cities/$1_tx [L,R=301,NC]
RewriteRule ^201\d/(dallas).*\.html$ /cities/$1_tx [L,R=301,NC]
RewriteRule ^201\d/(washington).*\.html$ /cities/$1_dc [L,R=301,NC]
RewriteRule ^201\d/(philadelphia).*\.html$ /cities/$1_pa [L,R=301,NC]
RewriteRule ^201\d/(atlanta).*\.html$ /cities/$1_ga [L,R=301,NC]
RewriteRule ^201\d/(rochester).*\.html$ /cities/$1_ga [L,R=301,NC]
RewriteRule ^201\d/(minneapolis).*\.html$ /cities/$1_mn [L,R=301,NC]
RewriteRule ^201\d/(chicago).*\.html$ /cities/$1_il [L,R=301,NC]
RewriteRule ^201\d/(new)-(york).*\.html$ /cities/$1_$2_ny [L,R=301,NC]
RewriteRule ^201\d/nyc.*\.html$ /cities/new_york_ny [L,R=301,NC]
RewriteRule ^201\d/(boston).*\.html$ /cities/$1_ma [L,R=301,NC]
RewriteRule ^201\d/(seattle).*\.html$ /cities/$1_wa [L,R=301,NC]
RewriteRule ^201\d/(denver).*\.html$ /cities/$1_co [L,R=301,NC]
RewriteRule ^201\d/(san)-(francisco).*\.html$ /cities/$1_$2_ca [L,R=301,NC]
RewriteRule ^201\d/(st).?.(louis).*\.html$ /cities/$1_$2_mo [L,R=301,NC]

在那里你会看到我为你准备的一些特殊情况。


说明

NC 标志删除区分大小写。

如果您需要更多,请告诉我。


另一面

正如有些人提到的那样,另一种方法是使用包含文件来简单地为您执行这些重定向,而不是使用 htaccess 这将允许您拥有城市和州的数据库,并使以下内容不作为独一无二。

【讨论】:

  • 哇!只需要为旧金山添加$2_,否则就完美了!!谢谢大家!
  • @Nimbuz 不是问题更正了错字!很高兴我能帮上忙
【解决方案2】:

试试这个:

RewriteEngine On
RewriteRule ^2010/([a-z]*)-([a-z]*)-details(-[0-9])*.html$ /cities/$1_$2_ca [R=301,L]

或:

RewriteEngine On
RewriteRule ^2010/([a-z]*)-([a-z]*)-([a-z]*)(-[0-9])*.html$ /cities/$1_$2_ca [R=301,L]

当您访问 http://www.mywebsite.com/2010/san-francisco-details.html 要么 http://www.mywebsite.com/2010/san-francisco-details-1.html

您将被重定向到 http://www.mywebsite.com/cities/san_francisco_ca

我不确定'_ca'部分在原始网址中的位置,所以我手动添加了它。

【讨论】:

  • 如果我去mywebsite.com/2010/---.html 我也会去mywebsite.com/cities/__ca 不幸的是,这对于这种情况来说不够具体。如果您将正则表达式更改为 ^2010/(san)-(francisco).*\.html$ 那么它将适用于 1 个城市案例
  • 没错,这不适用于所有城市,因为并非所有城市都在加州
  • 您的 cmets 是对的,它不适合您不希望 '_ca' 结尾的城市。对不起,我不是来自美国,我对美国城市不熟悉。如果帖子作者可以提供城市列表或其他信息,我可能会锻炼一些更好的东西。谢谢。 @abc123
猜你喜欢
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 2011-08-30
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多