Welcome to WebmasterWorld Guest from 54.161.64.174

Forum Moderators: Ocean10000 & incrediBILL & phranque

Message Too Old, No Replies

Where have I gone wrong with my redirect?

.htaccess catch-all not working...

     
11:41 am on Mar 15, 2014 (gmt 0)

5+ Year Member



Hi all,

I have a fairly complicated .htaccess file in my root, which controls a number of domains, amongst other things...

Here is the domain handling section:

#If visiting demo1.com, redirect elsewhere.
RewriteCond %{HTTP_HOST} ^(www\.)?demo1\.com
RewriteRule (.*) http://example.com/somewhere/$1 [R=301,L]
# If visiting one of these URLs, don't redirect.
RewriteCond %{HTTP_HOST} !^((www\.)?demo2\.com\.?(:[0-9]+)?)?$
RewriteCond %{HTTP_HOST} !^((www\.)?demo3\.com\.?(:[0-9]+)?)?$
RewriteCond %{HTTP_HOST} !^((www\.)?demo4\.com\.?(:[0-9]+)?)?$
# Don't redirect calls to files in this folder.
RewriteCond %{REQUEST_URI} !^/(_folder)/
# Don't redirect calls to these files.
RewriteCond $1 !^(page\.php|page\.html)$
# RewriteCond $1 !^(page\.php|sitemap\.xml|sitemap\.xml\.gz|robots\.txt|page\.html)$
# Send everything else here...
RewriteRule ^(.*)$ http://sub.example.com/$1 [R=301,L]


For the most part, it's working.

However, if I do something like ([url]www.)example.com/test(/)[/url] or ([url]www.)test.example.com[/url], both of which are non-existant URLs, it doesn't redirect you to example.com.

Where am I going wrong, please?

Thank you for your time.
6:49 pm on Apr 5, 2014 (gmt 0)

WebmasterWorld Administrator coopster is a WebmasterWorld Top Contributor of All Time 10+ Year Member



Did you ever get this sorted? Also, why even check for this if you are not going to redirect? Just leave this section out.

# If visiting one of these URLs, don't redirect. 
RewriteCond %{HTTP_HOST} !^((www\.)?demo2\.com\.?(:[0-9]+)?)?$
RewriteCond %{HTTP_HOST} !^((www\.)?demo3\.com\.?(:[0-9]+)?)?$
RewriteCond %{HTTP_HOST} !^((www\.)?demo4\.com\.?(:[0-9]+)?)?$
8:24 pm on Apr 5, 2014 (gmt 0)

WebmasterWorld Senior Member lucy24 is a WebmasterWorld Top Contributor of All Time Top Contributors Of The Month



Heh, I was about to comment on the same lines but from a different angle. The conditions obviously have to be present-- but why such detail? All you need is a single

RewriteCond %{HTTP_HOST} !\b(demo2|demo3|demo4)\.com


without anchors. And you only need the leading \b if you've got overlapping domain names on the same server so you need to watch for false positives.

Incidentally: commenting is useful. But commenting in mid-rule may make things harder to read. Rearranging the originally quoted rule, it seems to say:

RewriteCond %{REQUEST_URI} !^/(page\.php|page\.html)$
RewriteCond %{REQUEST_URI} !^/_folder/
RewriteCond %{HTTP_HOST} !(demo2|demo3|demo4)\.com
RewriteRule (.*) http://sub.example.com/$1 [R=301,L]

That's assuming you left out the / before (page\.php|page\.html), but that the ^ is intentional. In fact the two exclusions can be combined as
RewriteCond %{REQUEST_URI} !^/(folder|page\.php|page\.html)

leaving off the closing anchor. This leaves you with just two conditions instead of five. No point to the $1 in the condition, since you can't possibly be dealing with internal rewrites at this stage.
11:21 am on Apr 7, 2014 (gmt 0)

5+ Year Member



Hi coopster and lucy,

I've finally had some time to sit down and slowly go through this. After so long, this stuff still puzzles me greatly.

Many thanks for the tips. I've wittled down my code substantially.

RewriteCond %{HTTP_HOST} ^(www\.)?demo1\.za\.org
RewriteRule (.*) http://sub.domain.com/cat/$1 [R=301,L]
RewriteCond %{HTTP_HOST} !\b(demo2|demo3|demo4)\.(za.net|za.org|co.za|com|net)$
RewriteCond %{REQUEST_URI} !^/(_folder|page\.php|anotherpage\.html)
RewriteRule (.*)$ http://sub.domain.com/$1 [R=301,L]


It all seems to be working, but my original problem remains...

If someone visits(www.)example.com/test(/) or (sub|www).test.example.com, both of which are non-existant URLs, it doesn't redirect you to domain.com. :(
4:15 pm on Apr 7, 2014 (gmt 0)

WebmasterWorld Senior Member lucy24 is a WebmasterWorld Top Contributor of All Time Top Contributors Of The Month



Can you please put a blank line between your two rulesets? This is purely for the reader's sanity; blank lines have no meaning in htaccess. (They are just about the only thing that doesn't!)

This is admittedly tricky to illustrate within the confines of "example dot something". But I do think you don't need this bit:
RewriteCond %{HTTP_HOST} ^(www\.)?demo1\.za\.org

unless there are subdomains of "demo1" that you need to exclude? Otherwise it's just
demo1\.za\.org

without opening anchor.

In this group
RewriteCond %{HTTP_HOST} !\b(demo2|demo3|demo4)\.(za.net|za.org|co.za|com|net)$

just how many domains are on your server? You can leave off the whole tld-plus-closing-anchor part unless there are other domains, like maybe another .org, that you need to exclude from the rule.

It all seems to be working

What, exactly, is "working"? What types of requests are getting successfully redirected at this point?

Do you have wildcard subdomains, so any request for blahblah.example.com will arrive at your server? You can't do anything about requests that don't reach the server in the first place. That is, you can do something about them, but not within htaccess.
5:51 pm on Apr 7, 2014 (gmt 0)

5+ Year Member



Many thanks, Lucy.

I have trimmed my RewriteCond as shown and have learnt yet another trick. :)

I have 5 domains pointing to my server. Some are active, some are parked, some redirect, etc.

I don't use all of the TLDs, but I have added all of the main ones just as a precaution.

Lastly, I've just read up on wildcard domains and DNS and have learnt something again. Consider me educated on the matter.

I am indebted.
 

Featured Threads

Hot Threads This Week

Hot Threads This Month