【问题标题】:Passing an URL as a paramter using URL rewriting (apache)使用 URL 重写 (apache) 将 URL 作为参数传递
【发布时间】:2013-11-17 12:57:49
【问题描述】:

我创建了一个 .htaccess 文件,我尝试在其中重写某些 URL。我的目标是将 URL 作为参数传递给另一个脚本。它有点工作,但我最终得到的 URL 只在协议部分包含一个正斜杠(例如 http:/ 而不是 http://)

这是我的 .htaccess 文件

DirectoryIndex index.php

php_flag register_globals off
php_flag magic_quotes_gpc off
php_value display_errors 0

FileETag none
ServerSignature Off

Options All -Indexes

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^test/(.*)$ test.php?url=$1 [QSA,NC,NE,L]
</IfModule>

现在,当我请求以下内容时:http://example.org/test/http://myurl.com,php $_REQUEST 对象包含一个包含 http:/myurl.com

的 url 变量

编辑当我请求时:http://example.org/test/http%3A%2F%2Fmyurl.com,URL 根本不会被重写(与重写正则表达式不匹配)

我似乎找不到这个问题的正确解决方案,转义字符似乎不是问题(因为那将是一个反斜杠)

【问题讨论】:

    标签: php regex apache .htaccess mod-rewrite


    【解决方案1】:

    实际上您不应该从RewriteRule 捕获URL,因为Apache 将所有// 替换为/

    用这个替换你的规则:

    <IfModule mod_rewrite.c>
        RewriteEngine On
    
        RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+test/([^\s]+) [NC]
        RewriteRule ^.*$ test.php?url=%1 [QSA,NE,L]
    </IfModule>
    

    THE_REQUEST` 变量表示 Apache 从您的浏览器收到的原始请求。

    【讨论】:

    • 谢谢,你让我走上了正轨!我不得不在您的回答中更改一些内容,但您肯定为我指明了正确的方向!
    • 您能否将“$1”反向引用更改为“%1”,并且 RewriteRule 行应以 ^.*$ 开头,然后我可以接受您的提交作为答案。
    • @QNimbus 对不起,我的意思是%1,错误地输入了$1,现在更正了。
    • 关于RewriteRule ^ 它与RewriteRule ^.*$ 相同(可能更快,因为它不再匹配完整的URI。
    • @anubhava 你说得对RewriteRule ^,我不知道!再次感谢!
    【解决方案2】:

    您的问题是,在 URL 中,斜杠被视为目录。解析path//file 你得到path/file。这就是你的情况。

    要正确编码,您必须将http://myurl.com 的斜杠替换为%2Fhttp:%2F%2Fmyurl.com。请参阅percent encoding 了解更多信息。

    一般来说,一个更简单的解决方法是放弃http://

    【讨论】:

    • 我理解你的意思,但是当我转义(urlencode)我想传递的 url 时,重写正则表达式不再匹配。
    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    相关资源
    最近更新 更多