I have two editions of a website. The mobile and desktop version. All desktop sections of the website have normal urls and mobile sections have subdomain urls suffixed with the word mobile.


Main desktop site could be: http://core.website.com/
Mobile version of the same site could be: http://core-mobile.website.com/

Main promotional site could be: http://promo.website.com/
Mobile version of the same site could be: http://promo-mobile.website.com/

I want to try to achieve the redirections with mod_rewrite. Currently, I want to include the following lines in htaccess to detect mobile devices:

RewriteCond %{HTTP_USER_AGENT} (android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge\ |maemo|midp|mmp|mobile.+firefox|netfront|opera\ m(ob|in)i|palm(\ os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows\ ce|xda|xiino [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a\ wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r\ |s\ )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1\ u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(\ i|ip)|hs\-c|ht(c(\-|\ |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(\ |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(\ |\/)|klon|kpt\ |kwc\-|kyo(c|k)|le(no|xi)|lg(\ g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-|\ |o|v)|zz)|mt(50|p1|v\ )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v\ )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|\ )|webc|whit|wi(g\ |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-) [NC]

But the real core of the problem lies here:

RewriteCond %{HTTP_COOKIE} !DMOB=1
RewriteCond %{SERVER_NAME} ^(.+)^[(-mobile)]$ [NC]
RewriteRule ^(.*)$ http://%1-mobile/$1 [R=301,NC,L,CO=DMOB:1:.website.com:144000:/]

What I'm trying to accomplish here is the following:

When user visits a website without the -mobile sub-domain suffix, using a mobile device (as detected by the first two long RewriteRule lines) the system checks to see if the cookie named DMOB has a value of 1. If it does then nothing special happens and the requested site loads.

If however, DMOB is not set to 1 and a mobile device IS used, then the mobile sub-domain suffix must be added to the subdomain and then DMOB will be set to 1 starting with the next request and the url will be redirected over to the same thing plus the word -mobile appended to the subdomain name.

I tested it with curl using 1 and 0 for DMOB cookie values and I even tested it without the long mod_rewrite lines.

I think it has something to do with this line:

RewriteCond %{SERVER_NAME} ^(.+)^[(-mobile)]$ [NC]

But at the same time, I think that ^ means negate (or should I use a ! ?)

  • ^ matches the beginning of the line. ! = not. Your rewrite has two ^ which would never fly. ! is traditionally used at the beginning of the regex. So you say to yourself condition is server name not value --or-- !^enter value$ Also do not forget the [OR] where it applies- otherwise it is an AND. – closetnoc Feb 25 '15 at 1:57
  • The first long mod_rewrite rules are or-ed because that detects whether the device is mobile or not. the rest are and-ed – Mike Feb 25 '15 at 3:11
  • This might be a good regex jumping-off point: en.wikipedia.org/wiki/Regular_expression as well as this: regular-expressions.info – closetnoc Feb 25 '15 at 3:27

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Browse other questions tagged or ask your own question.