缺少.htaccess和mod_rewrite WHEN属性的SEF网址

时间:2014-01-08 16:33:12

标签: php .htaccess url mod-rewrite attributes

我的网址结构是:

/index.php?lang=en&state=FL&county=Miami-Dade&place=Miami&street=Collins&zip=33140

其中lang,州,郡,地点,街道和邮编都在层次结构中 - lang是顶层 - 包含以下所有级别。寻找像以下一样的SEF网址:

/en/FL/Miami-Dade/Miami/Collins/33140

当我在URL中给出所有级别时,我可以使用.htaccess和mod_rewrite处理,但在我的情况下,如果我提供任何URL,如

/index.php?lang=en&street=Collins&zip=33140
/index.php?zip=33140
/index.php?state=FL&place=Miami&zip=33140

它将完美运行,尝试使用SEF URL实现相同的目标:

/en/Collins/33140
/33140
/FL/Miami/33140

在这种情况下,.htaccess将读取SEF网址,并将第一个参数作为lang,第二个作为状态,第三个作为县,这将搞乱上面的所有三个示例(实际软件使用略有不同的数据,而不是这里介绍的 - 不能使用预定义的DB)。

一种解决方案是使用ISO代码分别处理lang和state参数,并从左到右读取其余参数,假设没有跳过参数,这将始终给出正结果。如果有人错过参数,则不会生成任何结果,并且可以使用PHP处理错误。

任何人都遇到类似的情况,如何在不涉及所有现有可能性的数据库的情况下解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以对此做一些假设,因为如果您知道状态总是2个大写字母,则zip为5个数字,lang为2个小写字母,并且城市,县和街道是两个大写和大写字母以及破折号和句号的混合,然后你可以尝试做一些猜测。

最好的方法可能不是强迫htaccess解决这个问题,它知道你的数据库中有什么,或街道或县是什么。您可以简单地使用PATH_INFO,并执行以下操作:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !^index\.php ^/index.php%{REQUEST_URI} [L]

然后使用php的$_SERVER['PATH_INFO']来获取请求(例如/en/FL/Miami-Dade/Miami/Collins/33140),将其展开,然后尝试匹配哪些节点。

您可以尝试做的另一件事是在每个节点前添加前缀或类似内容,例如:

/en/FL/c_Miami-Dade/p_Miami/s_Collins/33140
/en/s_Collins/33140
/FL/p_Miami/33140

然后,您将能够区分“国家”,“地点”和“街道”。