我正在开发一个以以下方式处理用户帐户的网站:
- www.mysite.com/username
- www.mysite.com/username/user-action
我了解mod_rewrite的基础知识,我可以这样做:
RewriteRule ^(/*)/?$ /index.php?username=$1 [QSA,L]
但是,这如何与我网站中的其他目录一起工作呢?我还有其他url,比如:
- www.mysite.com/about
- www.mysite.com/contact
我是否总是假设URL中的第一个"目录"是用户名,然后尝试验证它?然后,如果它不验证,不要做任何事情……DB上似乎有很多不必要的记录。如果是这种情况,那么如何处理导航到其他页面,因为它实际上是/index。php?Username =about at the point…我希望它能……这就是一个循环!
使用RewriteCond
:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(/*)/?$ /index.php?username=$1 [QSA,L]
此RewriteCond
首先检查文件是否实际存在,如果存在则不应用重写规则。否则将重写您的URL。
当然,根据您的情况,还有其他更合适的方法。但是一般来说,与其检查一个用户是否存在于数据库中,不如做相反的事情:检查它是否是一个有效的第一级目录/类别,如果不是,则假设它是一个用户。
另一个选项是将所有静态内容放在子目录/site/contact/site/about中。这极大地简化了在您经常更改站点上内容部分数量的情况下的维护问题。重写条件示例:
RewriteCond %{REQUEST_URI} !(site/) [NC]
然后你可以有另一个重写规则,适用于site/
,以防你想映射到CMS或其他东西。
最后,我建议您考虑使用web框架(symfony, yii, CodeIgniter),因为一旦您掌握了它的窍门,它们可以使您更快地开发,并且在某些情况下具有灵活的重写/路由规则。
首先处理物理地址(例如/resources/logo.png
),然后处理静态内容(/about/
…),然后处理动态内容(如用户)。
对于更常规的模式,我建议使用/user/[username]/action
。
我要怎么做就怎么做。/questions/{questionID}/{questionTitle}
, /users/{userID}/{userName}
,等等。使用uri中的第一个路径可以让您了解接下来会发生什么。