使用mod_rewrite将漂亮的URL重定向到GET变量并保留查询字符串

时间:2016-12-10 16:57:02

标签: php .htaccess mod-rewrite

状况: 我有一个基于文件目录的网站,上面有老式的网址,我试图转换为一个不需要这么多文件和目录的系统。

所以,这样的网址: www.mysite.org/members/support/newmember /

目前返回以下文件: www.mysite.org/members/support/newmember/index.php

这可行,但需要太多的目录和索引文件。

在为有太多工作的好友开发另一个网站时,我从他那里得到了一个脚本,该脚本使用mod_rewrite将旧式URL解析为$ _GET []变量。使用这个.htaccess脚本:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^([A-Z­a-z­0-9­-]+)/?$ index.php?folder=$1 [L]
RewriteRule ^([A-Z­a-z­0-9­-]+)/([A-Z­a-z­0-9­-]+)/?$ index.php?folder=$1&page=$2 [L]
RewriteRule ^([A-Z­a-z­0-9­-]+)/([A-Z­a-z­0-9­-]+)/([A-Z­a-z­0-9­-]+)?$ index.php?folder=$1&page=$2&subPage=$3 [L]

和一个老式的网址: www.mysite.org/members/support/newmember

我的根目录中的索引文件有以下可用的变量:     $ _GET ['夹']     $ _GET ['页面']     $ _GET ['子页']

并且索引文件中的脚本只是根据$ _GET变量组装正确的包含,从而消除了对这种扩展文件结构的需要。

问题: 查询字符串不再可用于PHP脚本。 Mod_rewrite已经吞并了它们,只吐出了.htaccess规则中定义的GET变量。这对于所有内部站点链接都是可以的,因为我可以放弃查询字符串并使用我的URL变量或SESSION变量来为我的页面提供值。但剩下的棘手问题是我的网站将人们发送到PayPal,我的脚本依赖于? PayPal发回我网站的查询字符串。 PayPal会向用户发回类似的内容:

www.mysite.org/support/members/newmemberconfirmation?id=1234567

和?id值,即使它出现在浏览器的URL窗格中,也不可用于脚本。

理想的解决方案: 我不知道如何为mod-rewrite编写脚本;我甚至无法自信地表达正则。我需要的是一个脚本,它将URL中的斜杠之间的值分配给GET变量,但也会使我的PHP脚本可以使用原始的GET变量。任何人都有我的片段会这样做吗?

1 个答案:

答案 0 :(得分:0)

更改3个标记[L]并使用[L,QSA]

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^([A-Z­a-z­0-9­-]+)/?$ index.php?folder=$1 [L,QSA]
RewriteRule ^([A-Z­a-z­0-9­-]+)/([A-Z­a-z­0-9­-]+)/?$ index.php?folder=$1&page=$2 [L,QSA]
RewriteRule ^([A-Z­a-z­0-9­-]+)/([A-Z­a-z­0-9­-]+)/([A-Z­a-z­0-9­-]+)?$ index.php?folder=$1&page=$2&subPage=$3 [L,QSA]
  

<强> QSA | qsappend
  当替换URI包含查询字符串时,默认行为   RewriteRule是丢弃现有的查询字符串,并替换它   与新生成的一个。使用[QSA]标志会导致查询   要组合的字符串。

http://httpd.apache.org/docs/current/en/rewrite/flags.html#flag_qsa