我正在编写自己的小框架,我将在那里实现友好的URL。 mod_rewrite很棒。但我希望能够同时处理几种类型的友好URL:
/index.php?ac=user&an=showprofile (fallback variant, the worst)
/index.php/user/showprofile (supposedly, can be disabled by security settings)
index.php?user/showprofile (optional, not needed)
/user/showprofile (ideal, but requires mod_rewrite or dirty ErrorDocument tricks)
我希望一次支持所有变体,以便使用任何方案生成的旧链接永远有效。我应该为此编写自己的解析函数,或者可能是,我错过了一些库/脚本,可以这样做吗?从像Symfony或Zend这样的大型框架中提取算法非常困难。还有许多不同的不明显案例,如纠正处理URL UTF-8编码或使用magic_quotes_runtime等...
答案 0 :(得分:1)
如果您可以通过编程方式区分所有不同类型的URL并将它们规范化为一个基本表单,则可以编写一个简单的标记化函数来规范化不同类型,并且可以使用规范化类型来获取实际目标。我已经完成了这个,但不是没有mod_rewrite。很确定它可以在没有它的情况下完成。
我通常有一个索引文件可以解析任何URL,然后执行一堆请求处理和路由以获取输出,而不会将任何url映射直接映射到任何文件。只需mod_rewrite该索引文件的所有内容并解析$_SERVER['REQUEST_URI']
。
答案 1 :(得分:0)
第一个到第三个应该传递给PHP进行处理($_GET
,$_SERVER["REQUEST_URI"]
和$_SERVER["QUERY_STRING"]
)。
第四个可以使用RewriteCond !-f
和适当的RewriteRule
使用mod_rewrite完成。
答案 2 :(得分:0)
您应该避免允许所有不同类型的网址。如果您发布的所有网址都显示相同的内容,那么SE会将其视为重复内容,您最终会“分割”您的排名。换句话说,四个页面中的每一个都将排名四分之一,如果所有内容都集中在一个URL上......如果这有意义的话。
只需选择一种对用户来说简单的网址格式,并坚持使用。我个人更喜欢最后一种,mod_rewrite
。你的问题暗示使用mod_rewrite
有一些“错误”,但没有。{/ p>
您还可以使用$_SERVER["REQUEST_URI"]
之类的内容来检测正在请求的网址,并执行301重定向到官方网址,如果有必要的话。