[users@httpd] Help with mod_rewrite rules

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

 



I'm trying to use a skip rule after a RewriteCond, but then the
conditions are not checked.

I've got these rewrite rules:

        RewriteCond %{REQUEST_URI} \.(jpe?g|gif|png|txt|doc|ppt|pdf)$
        RewriteCond %{REQUEST_URI} !/css/
        RewriteRule ^/(.+)$ /domains/default/$1             [last]

The goal is for any for those file types to rewrite the path.  This
works fine and the log shows:

    init rewrite engine with requested uri /foo.txt
    applying pattern '^/(.+)$' to uri '/foo.txt'
    RewriteCond: input='/foo.txt' pattern='\.(jpe?g|gif|png|txt|doc|ppt|pdf)$' => matched
    RewriteCond: input='/foo.txt' pattern='!/css/' => matched
    rewrite /foo.txt -> /domains/default/foo.txt
    local path result: /domains/default/foo.txt



Now the problem.  When there's a path prefix of "Rural" then I want
to not rewrite to /domains/default but rather to /domains/Rural.

So this is my attempt:

        RewriteCond %{REQUEST_URI} \.(jpe?g|gif|png|txt|doc|ppt|pdf)$
        RewriteCond %{REQUEST_URI} !/css/

        RewriteRule ^/Rural - [skip=1,nocase]
        RewriteRule ^/(.+)$ /domains/default/$1             [last]
        RewriteRule ^/(?:Rural/)?(.+)$ /domains/Rural/$1    [last,nocase]

So, the idea is if it matches /Rural it skips a rule and uses the
last rule to rewrite to /domains/Rural.  Otherwise it rewrites to /domains/default.

But when I do this the RewriteCond no longer is matched for /foo.txt:

    init rewrite engine with requested uri /foo.txt
    applying pattern '^/Rural' to uri '/foo.txt'
    applying pattern '^/(.+)$' to uri '/foo.txt'
    rewrite /foo.txt -> /domains/default/foo.txt
    local path result: /domains/default/foo.txt
    prefixed with document_root to /home/moseley/WS2/root/domains/default/foo.txt
    go-ahead with /home/moseley/WS2/root/domains/default/foo.txt [OK]

but is for /Rural/foo.txt


    init rewrite engine with requested uri /Rural/foo.txt
    applying pattern '^/Rural' to uri '/Rural/foo.txt'
    RewriteCond: input='/Rural/foo.txt' pattern='\.(jpe?g|gif|png|txt|doc|ppt|pdf)$' => matched
    RewriteCond: input='/Rural/foo.txt' pattern='!/css/' => matched
    applying pattern '^/(?:Rural/)?(.+)$' to uri '/Rural/foo.txt'
    rewrite /Rural/foo.txt -> /domains/Rural/foo.txt
    local path result: /domains/Rural/foo.txt
    prefixed with document_root to /home/moseley/WS2/root/domains/Rural/foo.txt
    go-ahead with /home/moseley/WS2/root/domains/Rural/foo.txt [OK]

It's vaguely familiar that it's a problem with how the RewriteCond
fires after the RewriteRule.

Am I not remembering how skip works?  Can I not use RewriteCond this
way?



I suppose the simple way is the following:

        RewriteCond %{REQUEST_URI} \.(jpe?g|gif|png|txt|doc|ppt|pdf)$
        RewriteCond %{REQUEST_URI} !/css/
        RewriteCond %{REQUEST_URI} ^/Rural                  [nocase]
        RewriteRule ^/(?:Rural/)?(.+)$ /domains/Rural/$1    [last,nocase]

        # now non-rural, do the same.

        RewriteCond %{REQUEST_URI} \.(jpe?g|gif|png|txt|doc|ppt|pdf)$
        RewriteCond %{REQUEST_URI} !/css/
        RewriteRule ^/(.+)$ /domains/default/$1             [last]








-- 
Bill Moseley
moseley@xxxxxxxx


---------------------------------------------------------------------
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