我创建了一个.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根本不会被重写(与某些重写正则表达式不匹配)
我似乎找不到适合这个问题的解决方案,它似乎不是转义字符的问题(因为那会是反斜杠)
答案 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
的斜杠替换为%2F
:http:%2F%2Fmyurl.com
。有关详细信息,请参阅percent encoding
。
更简单的解决方法是放弃http://
。