我希望我能让这个有意义。
我有这样的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