状况: 我有一个基于文件目录的网站,上面有老式的网址,我试图转换为一个不需要这么多文件和目录的系统。
所以,这样的网址: 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-Za-z0-9-]+)/?$ index.php?folder=$1 [L]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?folder=$1&page=$2 [L]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-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变量。任何人都有我的片段会这样做吗?
答案 0 :(得分:0)
更改3个标记[L]
并使用[L,QSA]
:
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?folder=$1 [L,QSA]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?folder=$1&page=$2 [L,QSA]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-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