Mod_rewrite和MySql

时间:2011-01-24 17:16:33

标签: mod-rewrite apache2

我有一个网址,例如。 www.example.com/user.php?user_id=9,其中user_id字段映射到用户表中的某个pk。我不希望网址是这样的,而是我想要一个像www.example.com/user/Aditya-Shukla.i这样的网址使用apache 2我明白mod-rewrite模块有一组重写规则可用于创建url别名。

我的问题是

我的所有href都是www.example.com/user.php?user_id=9。所以要更改网址,我想我必须将所有href更改为www.example.com/user/Aditya-Shukla并重写规则执行查询以获取记录?

是否有更好的解决方案。

3 个答案:

答案 0 :(得分:1)

不,mod_rewrite没有重写规则集。它提供了基于正则表达式模式构建规则的指令,这些模式可以与其他条件相结合。

在您的情况下,您将构建一条规则,该路径采用以/user/开头的任何请求的URL路径,并在其后跟随另一个路径段,并在内部将其重写为 user.php ,例如:

RewriteEngine on
RewriteRule ^/user/([^/]+)$ /user.php?name=$1

第一个指令RewriteEngine on只是为了启用mod_rewrite。第二个指令RewriteRule …是上述规则:^/user/([^/]+)$是匹配任何以/user/开头的网址路径的模式(即^/user/),然后是一个路径段(即([^/]+)$)。然后将该请求内部重写为/user.php,而/user/后面的匹配路径段用作 name 参数的参数值($1是参考到用(…)表示的第一组的匹配值。

因此,这会在/user/Aditya-Shukla内部重写/user.php?name=Aditya-Shukla的请求。然后,您可以使用该用户名并在表格中查找。

答案 1 :(得分:1)

您可以添加一个RewriteRule,将user/Aditya-Shukla重写为user.php?user_name=Aditya-Shukla并处理代码中的其余内容。

RewriteEngine On
RewriteRule ^user/(.*)$ user.php?user_name=$1

或使用RewriteMap指令查找用户名,这样可以直接将user/Aditya-Shukla重写为user.php?user_id=9

答案 2 :(得分:1)

我认为在您自己的网站中,您将始终创建URL的规范形式,即:

/user/Aditya-Shukla

...而且您只需要处理不是规范形式的外部链接,即“旧链接”,如:

www.example.com/user.php?user_id=9

mod_rewrite可能不适合在这种情况下重新映射。我假设你的用户可能很多,而且这个数字可能会增长。 mod_rewrite确实有一个RewriteMap指令,是的,有动态生成地图的方法,但我认为这不是一个好的设计(每次重写规则匹配时动态创建userId-to-userName的映射.. 。)

相反,您应该简单地编写user.php代码以查找正确的userName,组合您想要的规范形式的URL,并将重定向发送回客户端。类似的东西:

Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.example.com/user/Aditya-Shukla" );

你应该也可以使用301重定向(而不是302)来表明这是一个“永久性”的URL更改,这将有助于搜索机器人在遇到“旧式”URL时正确索引你的网站。

-broc

相关问题