我有一个网址,例如。 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并重写规则执行查询以获取记录?
是否有更好的解决方案。
答案 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