【问题标题】:php mod rewritephp mod重写
【发布时间】:2009-03-24 00:43:59
【问题描述】:

我有一个规则:

重写规则 ^cat_ap~([^~]+)~(.*)\.htm$ /urban/cat_ap.php?$1=$2 [L]

转到 cat_ap.php?nid=xxxxxxx

现在我必须添加一些其他支持。

cat_ap~pnid~290~nid~96666~posters~Sports.htm

需要解析为 cat_ap.php?pnid=290&nid=96666(我不关心链接的结尾,尽管我确实需要它来处理传统的付费搜索流量)。

另外,我需要从链接中获取 page_num 来计算分页。

cat_ap~PageNum_GetProduct~10~nid~290.htm 需要解析为 cat_ap.php?PageNum_GetProduct=10&nid=290

我有点需要将所有这些场景包含在一个或多个规则中。

有什么想法吗?我现在正在阅读此内容,但卡住了。

谢谢

【问题讨论】:

    标签: php apache mod-rewrite


    【解决方案1】:

    在这种情况下,我建议使用规则 RewriteRule ^cat_ap(~.*).htm$ /urban/cat_ap.php?$1 [L] 来捕获所有可能的组合和分解你的 php 应用程序中的字符串。

    这样调试参数会更容易,因为 apache 有时会很混蛋。

    【讨论】:

      【解决方案2】:

      这是一个循环遍历 URL 中的键/值对的解决方案:

      RewriteRule ^cat_ap~([^~]+)~([^~]+)(.*)\.htm$ cat_ap$1?$1=$2 [N,QSA]
      RewriteRule ^cat_ap(.*)\.htm$ /urban/cat_ap.php [L]
      

      它从 URL 中获取第一对,然后将其重写为完全相同的 URL没有该对,将该对添加到查询字符串 ([QSA]) 并重新开始重写过程([N])。当 URL 中不再有键/值对时,它会将其重写到您的脚本位置并终止重写 ([L])。

      cat_ap~pnid~290~nid~96666~posters~Sports.htm => /urban/cat_ap.php?posters=Sports&nid=96666&pnid=290
      cat_ap~PageNum_GetProduct~10~nid~290.htm => /urban/cat_ap.php?nid=290&PageNum_GetProduct=10
      

      (请注意,参数的顺序是颠倒的;这仅在同一个参数出现多次时才有意义。)

      【讨论】:

      • 实际上,[R] 会向浏览器发送一个 301 重定向,如果有很多参数,这可能会导致一个长的(且不必要的)HTTP 重定向链。我建议改用 [N](在上下文中:[N,QSA])。
      • 谢谢,我就是这个意思。 >.
      【解决方案3】:

      两种情况都试试这个:

      RewriteRule ^cat_ap~([^~]+)~([0-9]+)~([^~]+)~([0-9]+)(.*)\.htm$ /urban/cat_ap.php?$1=$2&$3=$4 [L]
      

      【讨论】:

        猜你喜欢
        • 2014-08-23
        • 1970-01-01
        • 1970-01-01
        • 2014-03-13
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        • 1970-01-01
        相关资源
        最近更新 更多