我有一个非常简单的网址重写规则:
RewriteEngine on
RewriteCond %{HTTP_HOST} !script.php
RewriteRule ^test/(.*) script.php?q=$1
我们的想法是拥有这样的网址:http://mywebsite.com/test/http://example.com
然后将http://example.com
作为查询参数发送到script.php。问题是我收到了http:/example.com
而不是http://example.com
。此外,http:////example.com
将以http:/example.com
的形式发送。是什么导致了这种行为?
答案 0 :(得分:0)
浏览器导致此行为。它将/
的序列合并为1 /
,因为它实际上仍然是一条路径。 /////
不会更改我们所在的目录,因此我们也可以使用/
。
您有两种选择:
更改链接以使用查询字符串。如果您将test/?q=something
重写为script.php?q=something
,一切都会按预期进行。您将执行以下操作:
RewriteRule ^test/?$ script.php [L]
由于您不会更改查询字符串,原始查询字符串会自动复制到新查询字符串。
不要假设你会遇到多少斜杠。该网址可能无法在浏览器的网址栏中正确显示,但如果只是重定向,则只会在很短的时间内显示。
RewriteRule ^test/(http|https):/+(.*)$ script.php?q=$1://$2
答案 1 :(得分:0)
Apache mod_rewrite
引擎将多个///...
转换为单个/
,以便在RewriteRule
指令中进行模式匹配。但是,如果您使用RewriteCond
进行匹配,则可以匹配多个 /
。
您可以使用以下规则:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/+test/+(https?://.+)$ [NC]
RewriteRule ^ script.php?q=%1 [L,QSA]