如果不止一个,重写会自动删除反斜杠吗?

时间:2014-10-25 13:10:19

标签: php regex .htaccess mod-rewrite redirect

我有一个非常简单的网址重写规则:

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的形式发送。是什么导致了这种行为?

2 个答案:

答案 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]