【问题标题】:Can I pass matched variables to the new URL with mod_rewrite?我可以使用 mod_rewrite 将匹配的变量传递给新的 URL 吗?
【发布时间】:2010-11-07 04:15:23
【问题描述】:

我在 PHP 方面很有经验,但我不太会使用 mod_rewrite(尽管我应该这样做)。我想问的是是否可以通过单个重写规则传递许多变量。

例如,是否可以重写:

localhost/test.php?id=1&name=test&var1=3

进入这个:

localhost/mysupertest/

并且还对不同的值使用相同的重写规则?

localhost/test.php?id=5&name=another_name&var3=42

进入

localhost/mysupertest/

我知道可以使用 Ajax、cookie、会话或 POST 变量来完成,但我真的很想使用 GET 变量。

【问题讨论】:

  • 您真的要将/test.php?id=1&name=test&var1=3 的请求重定向到/mysupertest/ 吗?或者相反,/mysupertest//test.php?id=1&name=test&var1=3 的请求?
  • 基本上我想为一个对象类别重写我的分页。假设我正在浏览类别超测。我不想为每个页面显示 mysupertest/page/1/ 或 mysupertet/page/2 但 mysupertest/

标签: php apache url mod-rewrite get


【解决方案1】:

我不完全确定您要的是什么,但您可能应该为 mod_rewrite 使用 [QSA] 选项,该选项将追加从“?”开始的所有 URL 参数。例如:

RewriteRule ^mysupertest/? test.php [QSA]

查看this question了解更多详情。

【讨论】:

    【解决方案2】:

    绝对有可能。这样的事情会做到这一点:

    RewriteRule test.php\?(.*)$ mysupertest/
    

    但是,如果这样做,您将丢失变量,因为它实际上与直接访问 localhost/mysupertest 相同,没有查询字符串数据。如果您想保留变量,也许在 REST 样式的 url 中,您可以使用反向引用来重写它们。正如 John 所提到的,反向引用只是一组括号,其中的任何匹配项都会成为数字排序方案中的变量。

    RewriteRule test.php\?id=(.*)&name=(.*)&var3=(.*)  mysupertest/$1/$2/$3
    

    根据上述规则,访问test.php?id=567&name=test&var3=whatever 与访问mysupertest/567/test/whatever 是一样的

    【讨论】:

      【解决方案3】:

      是的,这是可能的。您可以与正则表达式匹配的任何内容都可以重写为任何 url。每当您将正则表达式字符串的一部分放在括号 ( ) 内时,它就会成为一个可以在重写时使用的变量。

      你会想要这样的东西(我认为):

      RewriteRule test.php\?id=[0-9]+&name=.+&var1=[0-9]+ mysupertest/

      【讨论】:

        【解决方案4】:

        QUERY_STRING 不是 URI 的一部分。来自RewriteRule 的文档:

        注意:查询字符串

        如果您希望匹配主机名、端口或查询字符串,请分别使用 RewriteCond%{HTTP_HOST}%{SERVER_PORT}%{QUERY_STRING} 变量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-11
          • 1970-01-01
          • 2018-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-16
          相关资源
          最近更新 更多