使用URL重写(apache)将URL作为参数传递

时间:2013-11-17 12:57:49

标签: php regex apache .htaccess mod-rewrite

我创建了一个.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根本不会被重写(与某些重写正则表达式不匹配)

我似乎找不到适合这个问题的解决方案,它似乎不是转义字符的问题(因为那会是反斜杠)

2 个答案:

答案 0 :(得分:2)

实际上,您不应该从RewriteRule抓取网址,因为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 :(得分:0)

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

要对其进行正确编码,您必须将http://myurl.com的斜杠替换为%2Fhttp:%2F%2Fmyurl.com。有关详细信息,请参阅percent encoding

更简单的解决方法是放弃http://