【问题标题】:.htaccess at any length.htaccess 任意长度
【发布时间】:2010-10-03 20:31:38
【问题描述】:

执行此类操作的有效 .htaccess 规则是什么

/mypage/ --> /index.php?page=mypage
/mypage/param1/value1/ -->index.php?page=mypage&params=param1/value1

可能有无限数量的参数?

谢谢。

【问题讨论】:

    标签: regex .htaccess


    【解决方案1】:

    最好是将 /mypage/ 之后的整个部分作为参数传递给 php 脚本并对其进行解码:

    RewriteRule ^mypage/(.*) index.php?page=mypage&params=$1 [L,NC,QSA]
    

    如果你希望页面是动态的:

    RewriteRule ^([^/\.]+)/(.*) index.php?page=$1&params=$2 [L,NC,QSA]
    

    RewriteRule ^([^/\.]+)(/(.*))? index.php?page=$1&params=$3 [L,QSA]
    

    编辑
    添加 Cal 的建议,谢谢 Cal。

    编辑
    如果我正确理解您的评论:(如果不是,请解释)。您可以只使用带有默认操作的 switch 语句,该操作与页面变量的索引操作相同:

    switch($_GET['page']){
     case 'mypage':
      doMyPageStuff();
     break;
     case 'foo':
      doFooStuff();
     break;
     case 'index':
     default:
      doIndexStuff();
     break;
    }
    

    【讨论】:

    • 第二种方法是我需要的更多但是我如何忽略mypage之后的/?
    • 忽略是什么意思?如果您希望它是可选的,请执行以下操作: RewriteRule ^([^/\.]+)(/(.*))? index.php?page=$1&params=$3 [L,QSA] NC 是多余的,L 可能不是可取的,这取决于你在下面做什么
    • 在这些 rewriteRules 中,/ 不会被添加到页面参数中,你到底是什么意思?
    • 你想得到它还是你不想让它默认索引?如果它符合您的要求,请查看我的更新答案,否则请指定。
    【解决方案2】:
    RewriteRule ^([^/]+)/(.+)/?$    index.php?page=$1&params=$2
    

    或非常相似 - 手头没有服务器可以检查!

    【讨论】:

      【解决方案3】:

      我看到这已经有一个公认的答案,但我相信以下内容将只使用 mod_rewrite 完成您想要的。

      RewriteCond %{QUERY_STRING} ^(.*)$
      RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [L]
      RewriteCond %{QUERY_STRING} ^(.*)$
      RewriteRule ^([^/]+)/ $1.php?%1 [L]
      

      之所以有效,是因为 mod_rewrite 以递归方式运行。也就是说,每次重写后,都会再次处理新的 URL。每次遍历,最后的两个值都会变成查询参数,加入到查询字符串中。

      这将重写以下内容

      /mypage/param1/val1/param2/val2/param3/val3/...     --->
      /mypage.php?param1=val1&param2=val2&param3=val3&...
      

      当只剩下一个参数时它会停止。它将采用第一个“参数”并使用该名称调用 .php 文件。 param/val 对的数量没有限制。

      --
      bmb

      【讨论】:

        【解决方案4】:

        这是我的建议:

        RewriteRule ^([^/]+)/(([^/]+/[^/]+(/[^/]+/[^/]+)*)/)?$ /index.php?page=$1&params=$3 [L]
        

        这不是很好,但完全符合您的要求。它只允许以下形式的路径:

        /mypage/
        /mypage/param1/value1/
        /mypage/param1/value1/param2/value2/
        /mypage/param1/value1/param2/value2/param3/value3/
        /mypage/param1/value1/param2/value2/param3/value3/param4/value4/
        …
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-28
          • 1970-01-01
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          相关资源
          最近更新 更多