2014-01-08 32 views
1

我的URL结构是:SEF网址的.htaccess和mod_rewrite的WHEN属性丢失

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

其中lang,州,县,地方,街道和拉链都在一个层次 - 郎是最高级别 - 含以下所有级别。寻找一个SEF URL,如:

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

,我可以的.htaccess和mod_rewrite的处理在各级的URL,但在我的情况下给出,如果我给任何URL像

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

它会很好地工作,努力实现用相同的URL海基会:

/en/Collins/33140 
/33140 
/FL/Miami/33140 
在这种情况下

中的.htaccess将读取URL海基会并采取第一个参数为郎,第二个州和3日为县,这将间仔细看看上面的三个例子(实际的软件工作时数据略有不同,而不是这里介绍的 - 不能使用预定义的数据库)。

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

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

+0

你如何确定你的海基会网址哪部分属于哪个参数?对于一个人来说,这可能是可能的,但对于一台机器来说,不可能区分'/ en/Collins/33140'和'/ FL/Miami/33140'。请重新考虑您的网址格式。 – Sumurai8

+0

我会说强制一个URL结构并坚持下去。它使得URL更易于记忆和“可破解”(即,如果我将URL替换为“多伦多”中的“迈阿密”,我应该了解关于多伦多的详细信息),并且在路由请求时也使您的开发人员更容易开发。 –

回答

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 

然后你就可以在“国家”,“地方”之间进行区分,和“街道”。