Mod rewrite Mod_重写与MySql

Mod rewrite Mod_重写与MySql,mod-rewrite,apache2,Mod Rewrite,Apache2,我有一个url,例如www.example.com/user.php?user_id=9,其中user_id字段映射到user表中的一个pk。我不希望url是这样的,相反,我希望有一个类似www.example.com/user/Aditya Shukla的url。我使用的是apache 2,我知道mod rewrite模块有一组重写规则,可以用来创建url别名 我的问题是 我的href格式为www.example.com/user.php?user_id=9。因此,要更改url,我想我必须将所

我有一个url,例如www.example.com/user.php?user_id=9,其中user_id字段映射到user表中的一个pk。我不希望url是这样的,相反,我希望有一个类似www.example.com/user/Aditya Shukla的url。我使用的是apache 2,我知道mod rewrite模块有一组重写规则,可以用来创建url别名

我的问题是

我的href格式为www.example.com/user.php?user_id=9。因此,要更改url,我想我必须将所有href更改为www.example.com/user/Aditya-Shukla,并且为了重写规则,是否需要查询以获取记录


是否有更好的解决方案。

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

在您的情况下,您将构建一个规则,该规则接受任何请求的URL路径,该路径以
/user/
开头,后面有另一个路径段,并在内部将其重写到user.php,如:

第一条指令
RewriteEngine on
仅用于启用mod_rewrite。第二个指令
RewriteRule…
是如上所述的规则:
^/user/([^/]+)$
是与任何URL路径匹配的模式,该路径以
/user/
(即
^/user/
)开头,然后是一个路径段(即
([^/]+)$
)。然后,该请求在内部被重写到
/user.php
,而
/user/
后面的匹配路径段被用作name参数的参数值(
$1
是对第一组的匹配值的引用,用
(…)
表示)


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

您可以添加一个重写规则,将
user/Aditya Shukla
重写到
user.php?user_name=Aditya Shukla
并在代码中处理其余部分

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

或者使用指令查找用户名,这将允许将
user/Aditya Shukla
直接重写为
user.php?user_id=9

,我假设在您自己的站点中,您将始终创建URL的规范形式,即:

/user/Aditya-Shukla
…您只需处理非规范形式的外部链接,即“旧链接”,如:

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

相反,您只需编写user.php代码来查找正确的用户名,组装所需URL的规范格式,并将重定向发送回客户端。比如:

Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.example.com/user/Aditya-Shukla" );
您可能还应该使用301重定向(而不是302)来指示这是一个“永久”URL更改,这将有助于搜索机器人在遇到“旧式”URL时正确索引您的站点


-broc

我的主要问题是修复网站中的链接,比如说我将user.php?userid=9映射到user/Aditya Shukla。但是我有一些页面,人们可以看到用户列表,所以在href=“”中仍然有user.php?user=9。如何解决此问题?您的意思是您不控制此列出用户的页面?如果您控制页面并生成href内容,则在呈现页面时有机会提供“漂亮”的url。如果您不控制此页面,那么这就是为什么您要实现user.php以重定向响应。
www.example.com/user.php?user_id=9
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.example.com/user/Aditya-Shukla" );