【发布时间】:2011-06-14 12:35:41
【问题描述】:
我正在尝试使用 mod_rewrite 为用户和搜索引擎提供更好看的 URL - 这是许多动态网站上相当普遍的做法。
例如,我从以下开始:
http://www.mydomain.com/profile/view.php?id=136
假设用户号 136 被调用,为了争论 Bob T. Smith the 3rd(抱歉 Bob,如果你存在的话)。
据我所知,我的“讨厌”URL 中必须有 Bob 名字的变体,因为您只能重写存在的内容 - 所以我需要更改我的代码,以便此 URL 找到我们的个人资料'正在寻找:
http://www.mydomain.com/profile/view.php?id=bob-t-smith-the-3rd
现在可以变成
http://www.mydomain.com/profile/bob-t-smith-the-3rd
我正在使用自定义函数将下划线和空格转换为破折号,去除所有非字母数字字符,然后将所有内容小写以使 URL 看起来非常漂亮。
所以在我的页面中,我现在不必查找非常独特的主键“136”,而是查找用户名 - 但经过净化的版本,所以我正在使用这样的东西 -因为MySQL不能做正则表达式:
SELECT LOWER(REPLACE(REPLACE(REPLACE('Bob T. Smith the 3rd'," ","-"),"_","-"),".",""));
该名称显然会被 URL 中的任何内容替换,并进行清理。
我期望的问题是,不想将 MySQL REPLACE() 函数链接在一起来处理每个可能的非法字符(这会令人困惑,难以维护,并且可能效率低下),并且没有执行正则表达式的能力在查询方面,如何确保每次都找到并返回用户配置文件?
如果 Bob 注册为 'Bob T. Smith! (The 3rd)' - 我仍然会在 PHP 中将其清理为 bob-t-smith-the-3rd,因为 preg_replace 去掉了感叹号和括号,但我的查询 - 除非我添加更多 REPLACE () 函数,找不到该用户。
我是否应该确保用户只能使用 A-Z、0-9、破折号和下划线进行注册?
我是否应该以某种方式继续传递唯一的数字 ID,但只是以某种方式从重写规则中省略它?
我完全没有抓住重点吗?有没有一种我没有想到的可接受的方法?
谢谢:-)
【问题讨论】:
-
我想我偶然发现了另一个潜在的解决方案,到目前为止(在我的大脑中)它对我有用——当用户注册为“
Bob T. Smith the 3rd”时——以及将其存储为登录,我可以使用我的自定义 modRewriteEncode() 函数将剥离/清理的版本存储在旁边,以进行数据库查找?有人看到这有问题吗?
标签: php mysql .htaccess mod-rewrite