爆炸还是重写规则?利用来自连字符URL的变量

时间:2014-07-04 03:01:22

标签: php regex .htaccess mod-rewrite

我希望我能说明这一点。

我有网址'看起来像这样

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]

这非常适合解析" 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.php?使用正确的变量,同时保持所需的website.com/phoenix-arizona结构。

我认为我很接近,基本上,我需要一个Rewriterule来识别连字符并将它们分配给特定的参数,但是我终于在最后放弃之前一直在搜索和修补4个多小时!任何帮助都会受到赞赏,如果我没有正确地思考这个问题,那就不会让我感到惊讶,因为很明显我的正则表达式(RewriteRule)技能最多只是基本功能和爆炸功能,如果它甚至有效,可能会完全矫枉过正。

2 个答案:

答案 0 :(得分:0)

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

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标志,以将斜杠后的任何查询字符串附加到重写规则。我本可以使用通配符(。*)捕获该部分。我比他更喜欢他的方式。

状态很容易,因为USPS它们都有一些标准的两个字符代码。

编辑:现在是第二条规则

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上你就会知道状态名称需要通过你的字典数组来获得它的标准USPS 2字符代码。

再次,"接下来的任何事情"由于QSA标志而得到附加。您需要通过打印$_GET超全局并查找orfan键来使用php捕获该部分。

现在,当你得到

时会发生什么
http://www.domain.com/new-york-new-york-these-vagabond-shoes

当然,规则不会奏效。此外,这首歌是在纽约郡写的,大致相当于今天的曼哈顿。 (不相关的琐事)。

接下来只是一个想法。我相信你可以采用更有创意的方式

您需要一种方法从其他网址告诉各州的城市。一种方法是使用下划线来分隔复合名称,使用逗号将城市与州和连字符分开。

此规则

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

答案 1 :(得分:0)

此规则可用于将您的PHP代码转换为rewrite规则:

RewriteEngine On

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