2

大家好,

我正在尝试掌握 mod_rewrite 的魔力,需要一些建议/帮助。

我正在尝试从以下位置转换 URL:

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]

这设法创建一个 URL,如:http://www.domainname.com/preview/about/?id=5ID通过,我只需要 ?id=5 在 URL 中不可见。

提前感谢任何对此有解决方案的人,非常感谢。

更新:

我已经设法让以下代码按预期工作,唉,这是使用 ID 的静态值,我现在需要完成的是让它处理 ID 的动态值。

RewriteRule ^preview\/([^/]+)\/([^/]+)\/$       /preview\/$1      [R=301,QSA]
RewriteCond                                     %{QUERY_STRING} !.*id=5.*$
RewriteRule ^preview\/([^/]+)\/$                ?mode=preview&id=5 [L,QSA]
4

2 回答 2

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

于 2013-07-24T10:45:55.973 回答
2

您无法获得“不可见”的获取参数。您将得到的最接近的方法是设置一个 cookie 来继续传递这些数据。

RewriteRule ^preview/([^/]+)/([^/]+)[/]?$ preview/$1/ [CO=id:$2:127.0.0.1:1:/preview/$1:0:1,R]

在 php 中,您可以访问此 cookie,$_COOKIE['id']并且 id 在 url 中是不可见的(因为它实际上并不存在)。CO可以在此处找到有关该标志的文档。


编辑:如果你想用 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:我在第二条规则(到期时间 T-1 分钟)中添加了 id-cookie 的重置。如果用户决定preview/about/在 1 分钟内再次访问,这将导致正确的页面加载preview/about/5(重定向到preview/about/隐藏 id 设置为“5”以加载不同的内容)。

于 2013-07-25T13:25:59.017 回答