尝试在URL中使GET变量不可见,但使用mod_write保持其有用性

时间:2013-07-24 09:57:44

标签: .htaccess mod-rewrite

美好的一天,

我正在努力掌握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]

2 个答案:

答案 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'加载不同的东西)。