美好的一天,
我正在努力掌握mod_rewrite的魔力并需要一些建议/帮助。
我正在尝试从以下位置转换网址:
http://www.domainname.com/preview/about/5
对此:
http://www.domainname.com/preview/about
问题是,我仍然需要保留原始URL的[id]部分,以便稍后用作GET,并且不可见。
我到目前为止的代码:
RewriteRule ^preview\/([^/]+)\/([^/]+)\/$ /preview\/$1?id=$2 [R=301,QSA]
RewriteRule ^preview\/([^/]+)\/$ ?mode=preview&id=$2 [L,QSA]
这设法创建一个类似:http://www.domainname.com/preview/about/?id=5
的网址并传递ID
,我只需要在网址中隐藏?id = 5。
提前感谢任何有此解决方案的人,非常感谢。
更新:
我已经设法让以下代码按预期工作了,这就是使用ID的静态值所有我现在需要完成的是让它处理ID的动态值。
RewriteRule ^preview\/([^/]+)\/([^/]+)\/$ /preview\/$1 [R=301,QSA]
RewriteCond %{QUERY_STRING} !.*id=5.*$
RewriteRule ^preview\/([^/]+)\/$ ?mode=preview&id=5 [L,QSA]
答案 0 :(得分:2)
如果您没有将“ID”作为查询字符串的一部分(例如?id=5
)或URI的一部分(例如/preview/about/5
)传递,那么您需要在请求正文中传递它,像POST请求。否则,你不能让它“隐形”,因为网络服务器不会看到它。如果网络服务器没有将其视为请求,则mod_rewrite可能无法提取它。
假设您无法设置自己的网站,以便每次有人点击某个链接时,请求都会被张贴(有点像提交表单的方式),您最好的选择可能是看起来像http://www.domainname.com/preview/about/5
表格,或者http://www.domainname.com/preview/about-5
?
答案 1 :(得分:2)
你无法获得'隐形'获取参数。你最接近的是设置一个cookie来传递这些数据。
RewriteRule ^preview/([^/]+)/([^/]+)[/]?$ preview/$1/ [CO=id:$2:127.0.0.1:1:/preview/$1:0:1,R]
在php中,您可以使用$_COOKIE['id']
访问此Cookie,并且该ID在网址中不可见(因为它实际上并不存在)。可以找到有关CO
标记的文档here。
编辑:如果你想用mod_rewrite完成所有操作,你也可以从mod_rewrite访问这个cookie。由于这是内部重写,您可以直接使用要调用的实际文件的直接路径。
RewriteCond %{HTTP_COOKIE} id=([^;]*)
RewriteRule ^preview/([^/]+)[/]?$ preview/$1?id=%1 [CO=id:-:127.0.0.1:-1:/preview/$1:0:1,END]
Edit2:我在第二条规则中为id-cookie添加了重置(到期时间T-1分钟)。如果用户决定在转到preview/about/
后1分钟内再次转到preview/about/5
,则会导致加载正确的网页(重定向到preview/about/
且隐藏ID设置为'5'加载不同的东西)。