Forum Moderators: phranque

Message Too Old, No Replies

Redirect Subdomain to URL

         

onyx86

9:38 pm on Sep 29, 2009 (gmt 0)

10+ Year Member



I have a Magento web store in which I need to have multiple subdomains redirect to specific product category URLs, without showing customer. For instance:

widget-type1.example.com should forward to www.example.com/widgets/widgetpage.html

I have tried the following code in the .htaccess in the webroot:


RewriteEngine On
RewriteCond %{HTTP_HOST} widget-type1\.example\.com [NC]
RewriteRule (.*) http://www.example.com/widgets/widgetpage.html [L]

But it doesn't seem to work. I should state that I am quite new to mod_rewrite and apache in general. The server uses Plesk and has vhosts set up, so I have tried placing my code in a vhost.conf file but no luck.

There will be many subdomains, each redirecting to a different URL. I will probably have to write a rule for each subdomain since the URL they redirect to isn't always in the form of example.com/<subdomain>.html due to the way Magento works.

jdMorgan

11:18 pm on Sep 29, 2009 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



What about this code does not work? Does it do something wrong, not do anything at all, or what?

How did you test? What were the expected results? What were the actual results? How did the actual results differ from the expected results? Any error messages in the browser? Any relevant entries in the server error log? Did you completely flush (delete) your browser cache before testing?

Please be very, very specific, as otherwise it will take a long time and lots of posts to figure this out.

Jim

onyx86

5:43 pm on Sep 30, 2009 (gmt 0)

10+ Year Member



Sorry about that. I tested by pointing my browser to the URL. In this case widget-type1.example.com but the page sits with a white screen for about 45sec before it eventually shows the Plesk page saying "You see this page because there is no Web site at this address." I tried clearing the browser cache,clearing Magento's cache, restarting apache, and still no joy. The DNS has an A record for *.example.com so it accepts subdomains.

Magento includes a .htaccess file in the webroot full of settings for the store. Perhaps one of their rewrite is conflicting. Here is the .htaccess file with my example inserted where the real rewrite is (sorry its long):


############################################
## uncomment these lines for CGI mode
## make sure to specify the correct cgi php binary file name
## it might be /cgi-bin/php-cgi

# Action php5-cgi /cgi-bin/php5-cgi
# AddHandler php5-cgi .php

############################################
## GoDaddy specific options

Options -MultiViews

## you might also need to add this line to php.ini
## cgi.fix_pathinfo = 1
## if it still doesn't work, rename php.ini to php5.ini

############################################
## this line is specific for 1and1 hosting

#AddType x-mapp-php5 .php
#AddHandler x-mapp-php5 .php

############################################
## default index file

DirectoryIndex index.php

<IfModule mod_php5.c>

############################################
## adjust memory limit

# php_value memory_limit 64M
php_value memory_limit 128M
php_value max_execution_time 18000

############################################
## disable magic quotes for php request vars

php_flag magic_quotes_gpc off

############################################
## disable automatic session start
## before autoload was initialized

php_flag session.auto_start off

############################################
## enable resulting html compression

#php_flag zlib.output_compression on

###########################################
# disable user agent verification to not break multiple image upload

php_flag suhosin.session.cryptua off

###########################################
# turn off compatibility with PHP4 when dealing with objects

php_flag zend.ze1_compatibility_mode Off

</IfModule>

<IfModule mod_security.c>
###########################################
# disable POST processing to not break multiple image upload

SecFilterEngine Off
SecFilterScanPOST Off
</IfModule>

<IfModule mod_deflate.c>

############################################
## enable apache served files compression
## http://developer.yahoo.com/performance/rules.html#gzip

# Insert filter on all content
###SetOutputFilter DEFLATE
# Insert filter on selected content types only
#AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript

# Netscape 4.x has some problems...
#BrowserMatch ^Mozilla/4 gzip-only-text/html

# Netscape 4.06-4.08 have some more problems
#BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
#BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# Don't compress images
#SetEnvIfNoCase Request_URI \.(?:gif¦jpe?g¦png)$ no-gzip dont-vary

# Make sure proxies don't deliver the wrong content
#Header append Vary User-Agent env=!dont-vary

</IfModule>

<IfModule mod_ssl.c>

############################################
## make HTTPS env vars available for CGI mode

SSLOptions StdEnvVars

</IfModule>

<IfModule mod_rewrite.c>

############################################
## enable rewrites

Options +FollowSymLinks
RewriteEngine on

############################################
## you can put here your magento root folder
## path relative to web root

#RewriteBase /magento/

############################################
## workaround for HTTP authorization
## in CGI environment

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

############################################
## Compress, Combine and Cache Javascript/CSS
RewriteRule ^(index.php/)?minify/([^/]+)(/.*.(js¦css))$ lib/minify/m.php?f=$3&d=$2

############################################
## always send 404 on missing files in these folders

RewriteCond %{REQUEST_URI} !^/(media¦skin¦js)/

############################################
## never rewrite for existing files, directories and links

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

RewriteRule .* index.php [L]

############################################
## Subdomain Rewrites

RewriteCond %{HTTP_HOST} widget-type1\.example\.com [NC]
RewriteRule (.*) http://www.example.com/widgets/widgetpage.html [L]

</IfModule>

############################################
## Prevent character encoding issues from server overrides
## If you still have problems, use the second line instead

AddDefaultCharset Off
#AddDefaultCharset UTF-8

<IfModule mod_expires.c>

############################################
## Add default Expires header
## http://developer.yahoo.com/performance/rules.html#expires

ExpiresDefault "access plus 1 year"

</IfModule>

############################################
## By default allow all access

Order allow,deny
Allow from all

############################################
## If running in cluster environment, uncomment this
## http://developer.yahoo.com/performance/rules.html#etags

#FileETag none

jdMorgan

7:06 pm on Sep 30, 2009 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



Did you configure your DNS to map these subdomains to your server? If not, you'll need to do that. You will also need to have a unique IP address for your server in order to even be able to do this.

If you do not have a unique IP address for your server, you may find *some* support in your control panel for multiple subdomains (a.k.a. "add-on domains") but this support is generally limited as to the number of (sub)domains supported, and their ability to 'share' files (e.g. your scripts) with the 'main' domain and with each other. In short, it usually won't work for what you're trying to do.

Jim

onyx86

7:26 pm on Sep 30, 2009 (gmt 0)

10+ Year Member



I have mapped all the subdomains we will use in our DNS control panel.

It is a dedicated server which uses a single static IP address.

jdMorgan

8:12 pm on Sep 30, 2009 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



You may need to move your code above the "always send 404 on missing files in these folders " section, unless *all* URLs requested from the subdomain will always lead directly to existing physical files (i.e. the subdomains use only static pages -- URLs which are not to be subsequently rewritten to scripts).

Also, it is likely that you do not need the check the "-l" flag in the "never rewrite for existing files, directories and links" section unless you use and rely on symbolic links (rare). Doing so will improve your server performance under heavy load -- and perhaps noticeably.

The "no web site at this address" message is quite confusing, since it appears that your rule redirects (not rewrites) to your main domain, and I would think that that domain surely exists... (!)

Jim

onyx86

8:38 pm on Sep 30, 2009 (gmt 0)

10+ Year Member



I tried moving it up but still the same result.

I wonder if it has something to do with the way Plesk handles vhosts and subdomains. I may have to edit the httpd.include file.

onyx86

9:27 pm on Sep 30, 2009 (gmt 0)

10+ Year Member



Here is an update: I've resorted to using Plesk to create a subdomain, which adds the webroot folder /var/www/vhosts/<domain_name>/subdomains/<subdomain>/httpdocs

If I make a .htaccess file within the subdomains webroot, the code works. I guess I have to make a different folder for each subdomain and put a .htaccess in each one. I hoped to handle it through one .htaccess file without having to make physical folders for each subdomain but this is becoming difficult.

I'm pretty sure my problem is just the way Plesk handles apache and its configuration files. I will probably check with the Parallels forum. Thanks for your assistance Jim!

jdMorgan

10:04 pm on Sep 30, 2009 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



Before continuing, flesh-out one subdomain/subdirectory, and make sure that 'pages' in that sub/sub can access your scripts as needed. This is often not the case, as pages and scripts in the subdomain/subdirectory see that subdomain/subdirectory as 'the top of the world' on your server, and cannot "go above that subdirectory" to access scripts, etc. This is a common problem with the way 'add-on domains' are implemented by control panels, because, for security reasons, these add-ons are treated as much like totally-separate domains as possible. As a result, the support for subdomains that share resources is bad.

Jim

onyx86

2:46 pm on Oct 2, 2009 (gmt 0)

10+ Year Member



One more question: If I go with having the .htaccess file inside <subdomain>/<subdirectory> how do I get requests for www.example.com/widgets/widgetpage.html to rewrite back to <subdomain>.example.com without creating an infinite loop? I assume that a rule must be placed in the main webroot's .htaccess file for this?

onyx86

5:33 pm on Oct 2, 2009 (gmt 0)

10+ Year Member



This is the code I have in .htaccess file in the root of the Magento store (the long one posted above).


RewriteCond %{HTTP_HOST} !^widget-type1\.example\.com
RewriteCond %{REQUEST_URI} /widgets/widget-page\.html [NC]
RewriteRule (.*) [widget-type1.example.com...] [L]

This is what I have in <subdomain>/<subdirectory>


RewriteEngine On
RewriteCond %{THE_REQUEST} !^/widget-page\.html
RewriteCond %{HTTP_HOST} widget-type1\.example\.com [NC]
RewriteRule (.*) http://www.example.com/widgets/widget-page.html [L]

This is creating an infinite loop though.

jdMorgan

10:18 pm on Oct 2, 2009 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



It's sure be helpful if you'd comment that code and indicate what the purpose of each rule is supposed to be...

It's obvious that the two rules 302-redirect to each other and so will loop, but without knowing what they're meant to accomplish, it's hard to tell how to fix them.

Also, if you've used a control panel to set up this subdomain, it won't likely be possible to 'rewrite back' to the main site, because the two sites are considered separate, and the subdomain likely cannot access any files above its 'root' (which is the subdirectory of your main site).

Note that I'm using the terms 'redirect' and 'rewrite' in a semi-formal manner here: An internal rewrite maps a URL to a filepath, while an external redirect maps a URL to a different URL.

Also, if you're going through all this to get a 'keyword-in-subdomain' ranking advantage, I wouldn't bother; There are far simpler and less time-consuming things you could do to get a bigger/better benefit, and with far less risk of being labeled 'spammy' by the search engines...

Jim