Re: mod_rewrite Redirection ignoring the explicite code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks Igor and Eric for your help. :)  However, I'm not convinced
that's the cause here. Below is a bare minimum example that shows the
weird behavior I started with...

On Fri, 2010-05-07 at 09:34 +1000, Igor Cicimov wrote:
> Your 301 rule is wrong. As i said it should match the URI parth
> meaning the part after the slash following the domain name and not the
> whole URL. So no http:// in the rewrite rule hope this makes it more
> clear.

Yeah, you're referring to this early part of the RewriteRule docs,
right?

 "Pattern is [...]. On the first RewriteRule it is applied to the
  URL-path of the request; subsequent patterns are applied to the output
  of the last matched RewriteRule."

However, it is different with sub-sequent rules, and only those I use to
match a protocol. (I just want to paranoidly ensure I'm not redirecting
by accident. And the full code also supports more than 3xx only, by
using special mappings.)

So, here is a *minimal* stripped down example that demonstrates the
weird behavior I'm asking about.

  RewriteRule  ^/foo          http://example.net/
  RewriteRule  ^http://       -                    [R=301,L]

  RewriteRule  ^/bar          http://example.org/
  RewriteRule  ^(http://.*)$  $1                   [R=301,L]

Now, "GET /foo HTTP/1.1" redirects to the rewritten URI as expected, but
it ignores my explicit 301 return code and instead defaults to 302.

  HTTP/1.1 302 Found
  Location: http://example.net/

The second one, "GET /bar HTTP/1.1", does work exactly as I expected, as
clearly shown in the result. Also, with the sub-sequent RewriteRules, it
does match the full URI as substituted before (checked this with another
debugging rule, appending a path).

  HTTP/1.1 301 Moved Permanently
  Location: http://example.org/

The only difference I see -- as mentioned in my initial post -- is the
explicit substitution as opposed to "just keep it" by using the dash.
And since in this one case I do not want to add or change anything, but
keep it and just force the redirect if it matches (trailing slash in
working code), the RE backreference and substitution with itself,
verbatim and in full, just doesn't seem necessary.

However, if I do *not* do the useless substitute-with-self, I end up
with my 301 redirection code being ignored...


Again, do these results show a bug? Is the dash intended and expected to
always default to 302, no matter the explicit code given? Or do I still
not see what is wrong with the rules?

  guenther


-- 
char *t="\10pse\0r\0dtu\0.@ghno\x4e\xc8\x79\xf4\xab\x51\x8a\x10\xf4\xf4\xc4";
main(){ char h,m=h=*t++,*x=t+2*h,c,i,l=*x,s=0; for (i=0;i<l;i++){ i%8? c<<=1:
(c=*++x); c&128 && (s+=h); if (!(h>>=1)||!t[s+h]){ putchar(t[s]);h=m;s=0; }}}


---------------------------------------------------------------------
The official User-To-User support forum of the Apache HTTP Server Project.
See <URL:http://httpd.apache.org/userslist.html> for more info.
To unsubscribe, e-mail: users-unsubscribe@xxxxxxxxxxxxxxxx
   "   from the digest: users-digest-unsubscribe@xxxxxxxxxxxxxxxx
For additional commands, e-mail: users-help@xxxxxxxxxxxxxxxx


[Index of Archives]     [Open SSH Users]     [Linux ACPI]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Squid]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux