【问题标题】:htaccess rewrite subdirectory name to querystring paramhtaccess 将子目录名称重写为查询字符串参数
【发布时间】:2011-01-27 23:57:27
【问题描述】:

我对我网站的某个目录有一些特定的需求。我需要改变

/thisDirectory/subDirectory

通过

/thisDirectory?param=subDirectory

我在成功创建可以执行此操作的 htaccess 文件时遇到问题。我尝试了几种不同的方法,但我认为这是最接近的:

RewriteEngine On
RewriteRule ^/directory/(.*)\??(.*)$ /directory/?page=$1&$2

我一直面临各种 500 服务器错误、无限重定向循环等。任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: .htaccess mod-rewrite rewrite


    【解决方案1】:

    我很惊讶这在每个目录的上下文中确实有效,因为您必须从模式中去除每个目录的路径前缀:

    在 .htaccess 文件中使用重写引擎时,每个目录的前缀(对于特定目录始终相同)会自动删除以进行RewriteRule 模式匹配并自动在任何相对(不以斜杠或协议名称开头)替换遇到规则集末尾之后添加

    如果文档根目录是前导 / 并且规则如下所示:

    RewriteRule ^directory/(.*)\??(.*)$ /directory/?page=$1&$2
    

    但除此之外,RewriteRule 只能检查 URI 路径,不能检查查询;你需要RewriteCond 来做到这一点。所以试试这个:

    RewriteRule ^directory/(.+)$ /directory/?page=$1 [QSA]
    

    这里.+ 而不是.* 应该避免无限递归,因为.* 匹配所有内容,甚至是空字符串(/directory/ 之后的空路径段就是这种情况)。而QSA flag则是自动将请求的URI查询追加到新的查询中。

    【讨论】:

      【解决方案2】:

      在经历了很多挫折之后......我认为问题是试图重写同一个“目录”(虽然我认为 [L] 会处理它而不是循环......但这似乎并没有是这样)。我更改了它正在重写的目录的名称,它似乎可以工作......

      RewriteBase /my/base/rewrite/
      RewriteRule ^directory/(.*)$ newDirectory/?page=$1 [L]
      

      【讨论】:

        猜你喜欢
        • 2016-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-14
        • 2012-10-11
        • 2010-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多