【问题标题】:URL encode in htaccess, maybe?在 htaccess 中进行 URL 编码,也许?
【发布时间】:2012-11-20 10:57:50
【问题描述】:

考虑以下场景:

我希望能够访问http://www.example.com/word/hello/,其中hello 这个词是可变的。所以我设置了.htaccess 来配置它。

RewriteEngine On
RewriteRule ^word/(.+)/?$ displayword.php?word=$1 [L]

我使用.+ 是因为我还想过滤任何符号,例如?+-.!;: 等。

我相应地设置了我的 PHP 文件:

<?php
echo $_GET['word'];
?>

请记住,这只是一个场景。现在,我访问了这个 URL:http://www.example.com/word/Are you ok?/,页面输出了这个:

Are you ok

我不知道为什么。但后来我意识到问号符号是URL变量的起点。

那么有没有办法对上例中的问号进行“url 编码”,以使其正确显示?

【问题讨论】:

    标签: php .htaccess get


    【解决方案1】:

    不需要编码,试试这个:

    RewriteEngine On
    RewriteRule ^word/([a-zA-Z0-9-=_.?]+)/?$ displayword.php?word=$1 [L]
    

    它将在参数中显示? 以及您添加到[group] 的任何其他字符。不过,我没有测试该规则是否有效,但我想它确实有效。看起来不错,这不是问题。

    【讨论】:

      【解决方案2】:

      将您的代码更改为:

      RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+word/([^/]+) [NC]
      RewriteRule ^ index.php?word=%1 [L,QSA]
      

      之所以有效,是因为 RewriteRule 适用于 %{REQUEST_URI},它获取 URI,即问号 ? 之前的字符串,但 %{THE_REQUEST} 也适用于包含问号 ? 的完整 URL。

      【讨论】:

        【解决方案3】:

        在 HTTP 协议中,“?”将查询字符串与 URL 的其余部分分开,所以我认为不可能直接在 URL 中使用它。一种解决方案是将问号编码为%3F。

        然后你可以使用string urldecode (string $str)来解码字符串。

        其他字符的编码见URL Encoding Reference。

        【讨论】:

          【解决方案4】:

          我不太了解 .htaccess 文件,但您可以将 PHP 脚本更改为使用 $_SERVER['PATH_INFO'] 而不是 $_GET 或 $_REQUEST。

          特别是,this comment 可能会帮助您。

          【讨论】:

            猜你喜欢
            • 2014-05-27
            • 2013-08-10
            • 1970-01-01
            • 2012-09-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-13
            • 2015-05-02
            相关资源
            最近更新 更多