【问题标题】:use mod_rewrite to redirect pretty url to GET vars and also preserve query string使用 mod_rewrite 将漂亮的 url 重定向到 GET vars 并保留查询字符串
【发布时间】:2017-04-25 23:14:25
【问题描述】:

情况: 我有一个带有老式 URL 的基于文件目录的网站,我正在尝试将其转换为不需要这么多文件和目录的系统。

所以,这样的网址: 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]

还有一个老式的 URL,例如: 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 变量,但也会使原始 GET 变量可用于我的 PHP 脚本。有人有我的sn-p可以做到吗?

【问题讨论】:

  • 您应该开始阅读文档和一些基本的“入门”教程。所有这些都在各处进行了解释。该文档实际上还提供了您要求的那些“sn-ps”......
  • 已经有几十个,如果不是几百个问题在处理这个问题。您正在以艰难的方式进行操作,而这首先导致了您的问题。当另一个问题的解决方案是平均的时,我不愿意将一个问题标记为重复。 Send everything to index.php in one rule 你会看到$_SERVER['REQUEST_URI'] 包含你需要的东西。

标签: php .htaccess mod-rewrite


【解决方案1】:

更改 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

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 2012-08-30
    • 2018-05-11
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    相关资源
    最近更新 更多