缺少具有.htaccess和mod_rewrite WHEN属性的SEF URL



我的URL结构是:

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

lang、州、县、地方、街道和zip在一个层次结构中,lang是最高级别,包含以下所有级别。正在查找SEF URL,如:

/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 url,并将第一个参数作为lang,第二个参数作为state,第三个参数作为country,这将混淆上面的所有三个示例(实际软件使用的数据略有不同,而不是这里提供的数据-不能使用预定义的DB)。

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

有人遇到过类似的情况吗?有没有关于如何在不涉及所有现有可能性的数据库的情况下解决这个问题的想法?非常感谢。

您可以对此做出一些假设,因为如果您知道州总是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

然后你就能区分"国家"、"地方"one_answers"街道"。

最新更新