引爆还是改写规则?利用连字符URL's中的变量


To Explode or RewriteRule? Utilizing Variables From Hyphenated URL's

我希望我能让这个有意义。

我有这样的url

http://www.website.com/state/AZ/Phoenix

现在我把它们写到

http://www.website.com/AZ

使用重写代码解析(借用的)

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^([^/.]+)(?:/)?$ /x.php?state=$1 [L]
 RewriteRule ^([^/.]+)/([^/.]+)(?:/)?$ /x.php?state=$v1 [L]
 RewriteRule ^([^/.]+)/([^/.]+)/([^/.]+)(?:/.*)?$ /x.php?state=$1&city=$2 [L]

这对于解析url的"AZ"部分并将其用作变量非常有用。太棒了。然而,我想更进一步,开始使用城市,甚至更疯狂?顺序不同

期望的URL格式:http://www.website.com/phoenix-arizona-other-words

注意:我明白这不是说"AZ",这很好,我会通过数组将状态转换为缩写-更重要的部分是抓住前两个单词,用连字符分隔,并将它们分配给变量。

为了使我的代码正常工作,我需要找到一种方法来爆炸URL中的"-"并以这种方式分配变量…

//my terrible attempt at fixing this the HARD way
$variables  = explode("-", urldecode(substr($_SERVER['REQUEST_URI'], 1)));
$city       = isset($variables[1]) ? $variables[1] : false;
$state      = isset($variables[2]) ? $variables[2] : false;

还是……

一个RewriteRule可能会节省一天,并理解如何处理新格式化的URL和允许x.p p?使用正确的变量,同时保持所需的website.com/phoenix-arizona结构。

我想我已经接近了,基本上,我需要一个rewriterrule来识别连字符并将它们分配给特定的参数,但是在最终屈服之前,我已经在这上面搜索和修补了4个多小时!任何帮助都是值得感激的,如果我没有正确思考这一点,我也不会感到惊讶,因为很明显我的regex (RewriteRule)技能充其量是基本的,而爆炸功能,如果它甚至有效,可能完全是多余的。

这个规则应该可以把你的PHP代码转换成rewrite规则:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^-]+)-([^/-]+)-(.+)$ /x.php?state=$1&city=$2 [L,QSA]

ok。我明天试着完成这个答案。但是对于第一条规则,您可以尝试使用

RewriteRule ^([A-Z]){2}/? /x.php?state=$1& [L,QSA]

这意味着:匹配从A到Z的两个大写字符,后面跟着一个可选的斜杠和后面的任何字符

http://www.website.com/AZ

http://www.website.com/x.php?state=AZ

http://www.website.com/AZ/whatever-url

http://www.website.com/x.php?state=AZ&whatever-url

请注意,我已经添加了@anubhava QSA标志,以便在重写规则的斜杠之后附加任何查询字符串。我也可以用通配符(.*)捕获该部分。比起我的,我更喜欢他的方式。

各州很容易,因为多亏了美国邮政总局,他们都有标准的两个字符代码。

编辑:现在为第二条规则
RewriteRule ^([^-]+)-([^/-]+)- /x.php?statelong=$2&city=$1& [L,QSA]

http://www.domain.com/tucson-arizona-whatever-comes-next

http://www.domain.com/x.php?statelong=arizona&city=tucson&whatever-comes-next

请注意,我将捕获的项反转,因此我将第二个传递给statelong。通过这种方式,在PHP中,您将知道州名需要遍历字典数组以获得其标准usps2字符代码。

再次,由于QSA标志,"whatever comes next"被附加。您需要使用php通过打印出$_GET超全局变量并查找orfan键来捕获该部分。

现在,当你得到

http://www.domain.com/new-york-new-york-these-vagabond-shoes

这个规则当然行不通。此外,这首歌是在纽约郡存在的时候写的,大致相当于今天的曼哈顿。(无关紧要的琐事)。

下一个只是一个想法。我相信你能想出更有创意的办法

您需要一种从url的其余部分区分城市和州的方法。一种方法是用下划线分隔组合名称,用逗号分隔城市和州,用连字符分隔其他名称。

此规则

RewriteRule ^(['w_]+),(['w_]+)- /x.php?statelong=$2&city=$1& [L,QSA]

http://www.domain.com/new_york,new_york-this-vagabond-shoes

http://www.domain.com/x.php?statelong=new_york&city=new_york&this-vagabond-shoes