views:

4510

answers:

9

I have not having any luck getting my .htaccess with mod_rewrite working. Basically all I am trying to do is remove 'www' from "http://www.example.com" and "https://www.example.com".

If there is anything I am missing (conf files, etc let me know I willl update this)

Here is my .htaccess file (located @ /var/www/site/trunk/html/)

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule (.*) //%1/$1 [L,R=301]

My mod_rewrite is enabled:

root@s15348441:/etc/apache2/mods-available# more rewrite.load
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

My apache config files:

apache2.conf

#
# Based upon the NCSA server configuration files originally by Rob McCool.
#
# This is the main Apache server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.2/ for detailed information about
# the directives.
#
# Do NOT simply read the instructions in here without understanding
# what they do.  They're here only as hints or reminders.  If you are unsure
# consult the online docs. You have been warned.  
#
# The configuration directives are grouped into three basic sections:
#  1. Directives that control the operation of the Apache server process as a
#     whole (the 'global environment').
#  2. Directives that define the parameters of the 'main' or 'default' server,
#     which responds to requests that aren't handled by a virtual host.
#     These directives also provide default values for the settings
#     of all virtual hosts.
#  3. Settings for virtual hosts, which allow Web requests to be sent to
#     different IP addresses or hostnames and have them handled by the
#     same Apache server process.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path.  If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "/var/log/apache2/foo.log"
# with ServerRoot set to "" will be interpreted by the
# server as "//var/log/apache2/foo.log".
#

### Section 1: Global Environment
#
# The directives in this section affect the overall operation of Apache,
# such as the number of concurrent requests it can handle or where it
# can find its configuration files.
#

#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE!  If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the LockFile documentation (available
# at <URL:http://httpd.apache.org/docs-2.1/mod/mpm_common.html#lockfile&gt;);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
ServerRoot "/etc/apache2"

#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
#<IfModule !mpm_winnt.c>
#<IfModule !mpm_netware.c>
LockFile /var/lock/apache2/accept.lock
#</IfModule>
#</IfModule>

#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15

##
## Server-Pool Size Regulation (MPM specific)
## 

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75 
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>

# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

#
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives.  See also the AllowOverride
# directive.
#

AccessFileName .htaccess

#
# The following lines prevent .htaccess and .htpasswd files from being 
# viewed by Web clients. 
#
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>

#
# DefaultType is the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, "text/plain" is
# a good value.  If most of your content is binary, such as applications
# or images, you may want to use "application/octet-stream" instead to
# keep browsers from trying to display binary files as though they are
# text.
#
DefaultType text/plain


#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog /var/log/apache2/error.log

#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn

# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

# Include all the user configurations:
Include /etc/apache2/httpd.conf

# Include ports listing
Include /etc/apache2/ports.conf

#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
# If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

#
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of:  Full | OS | Minor | Minimal | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Full

#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory 
# listings, mod_status and mod_info output etc., but not CGI generated 
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#
ServerSignature On


#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#

#
# Putting this all together, we can internationalize error responses.
#
# We use Alias to redirect any /error/HTTP_<error>.html.var response to
# our collection of by-error message multi-language collections.  We use 
# includes to substitute the appropriate text.
#
# You can modify the messages' appearance without changing any of the
# default HTTP_<error>.html.var files by adding the line:
#
#   Alias /error/include/ "/your/include/path/"
#
# which allows you to create your own set of files by starting with the
# /usr/share/apache2/error/include/ files and copying them to /your/include/path/, 
# even on a per-VirtualHost basis.  The default include files will display
# your Apache version number and your ServerAdmin email address regardless
# of the setting of ServerSignature.
#
# The internationalized error documents require mod_alias, mod_include
# and mod_negotiation.  To activate them, uncomment the following 30 lines.

#    Alias /error/ "/usr/share/apache2/error/"
#
#    <Directory "/usr/share/apache2/error">
#        AllowOverride None
#        Options IncludesNoExec
#        AddOutputFilter Includes html
#        AddHandler type-map var
#        Order allow,deny
#        Allow from all
#        LanguagePriority en cs de es fr it nl sv pt-br ro
#        ForceLanguagePriority Prefer Fallback
#    </Directory>
#
#    ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
#    ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
#    ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
#    ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
#    ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
#    ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
#    ErrorDocument 410 /error/HTTP_GONE.html.var
#    ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
#    ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
#    ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
#    ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
#    ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
#    ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
#    ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
#    ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
#    ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
#    ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var



# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.

# Include generic snippets of statements
Include /etc/apache2/conf.d/

# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/

My default config file for www on apache

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin [email protected]

    #SSLEnable
    #SSLVerifyClient none
    #SSLCertificateFile /usr/local/ssl/crt/public.crt  
    #SSLCertificateKeyFile /usr/local/ssl/private/private.key  

    DocumentRoot /var/www/site/trunk/html
    <Directory />
     Options FollowSymLinks
     AllowOverride all
    </Directory>
    <Directory /var/www/site/trunk/html>
     Options Indexes FollowSymLinks MultiViews
     AllowOverride all
     Order allow,deny
     allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
     AllowOverride None
     Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
     Order allow,deny
     Allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined
    ServerSignature On

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

My ssl config file

NameVirtualHost *:443
<VirtualHost *:443>
    ServerAdmin [email protected]

    #SSLEnable
    #SSLVerifyClient none
    #SSLCertificateFile /usr/local/ssl/crt/public.crt  
    #SSLCertificateKeyFile /usr/local/ssl/private/private.key  

    DocumentRoot /var/www/site/trunk/html
    <Directory />
     Options FollowSymLinks
     AllowOverride all
    </Directory>
    <Directory /var/www/site/trunk/html>
     Options Indexes FollowSymLinks MultiViews
     AllowOverride all
     Order allow,deny
     allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
     AllowOverride None
     Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
     Order allow,deny
     Allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    SSLEngine On
        SSLCertificateFile /usr/local/ssl/crt/public.crt
        SSLCertificateKeyFile /usr/local/ssl/private/private.key


    CustomLog /var/log/apache2/access.log combined
    ServerSignature On

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

My /etc/apache2/httpd.conf is blank

The directory /etc/apache2/conf.d has nothing in it but one file (charset)

contents of /etc/apache2/conf.dcharset

# Read the documentation before enabling AddDefaultCharset.
# In general, it is only a good idea if you know that all your files
# have this encoding. It will override any encoding given in the files
# in meta http-equiv or xml encoding tags.

#AddDefaultCharset UTF-8

My apache error.log

[Wed Jun 03 00:12:31 2009] [error] [client 216.168.43.234] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
[Wed Jun 03 05:03:51 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:03:54 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:13:48 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:13:51 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:13:54 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:13:57 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:17:28 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 05:26:23 2009] [notice] caught SIGWINCH, shutting down gracefully
[Wed Jun 03 05:26:34 2009] [notice] Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g configured -- resuming normal operations
[Wed Jun 03 06:03:41 2009] [notice] caught SIGWINCH, shutting down gracefully
[Wed Jun 03 06:03:51 2009] [notice] Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g configured -- resuming normal operations
[Wed Jun 03 06:25:07 2009] [notice] caught SIGWINCH, shutting down gracefully
[Wed Jun 03 06:25:17 2009] [notice] Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g configured -- resuming normal operations
[Wed Jun 03 12:09:25 2009] [error] [client 61.139.105.163] File does not exist: /var/www/site/trunk/html/fastenv
[Wed Jun 03 15:04:42 2009] [notice] Graceful restart requested, doing restart
[Wed Jun 03 15:04:43 2009] [notice] Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g configured -- resuming normal operations
[Wed Jun 03 15:29:51 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 15:29:54 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 15:30:32 2009] [error] [client 99.247.237.46] File does not exist: /var/www/site/trunk/html/favicon.ico
[Wed Jun 03 15:45:54 2009] [notice] caught SIGWINCH, shutting down gracefully
[Wed Jun 03 15:46:05 2009] [notice] Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g configured -- resuming normal operations
+1  A: 

How about this rewrite rule?

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^www.site.com$ [NC]
RewriteRule ^(.*)$ http://site.com/$1 [R=301,L]
Colin Pickard
this would not work for me, as I use SSL also.
Mike Curry
In fact the reason I want this to work is so that https://www.site.com gets changed to https://site.com
Mike Curry
A: 

Try this little trick:

RewriteEngine on
RewriteCond %{HTTPS}s/%{HTTP_HOST} ^(on(s)|[^/]+)/www\.(.+) [NC]
RewriteRule ^ http%2://%3%{REQUEST_URI} [L,R=301]
Gumbo
A: 

Or this:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteCond %{HTTP_PORT} =443
RewriteRule (.*) https://%1/$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule (.*) http://%1/$1 [L,R=301]
chaos
+5  A: 
RewriteEngine on
RewriteCond %{HTTPS} =on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ https://%1$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1$1 [L,R=301]

Two slight changes from other answers:

The %1 backreference in the RewriteRule takes from the last matched RewriteCond, so the check for HTTPS must come before the check for www in the host name.

%1$1 doesn't need a slash in the middle, because you'll get that from the path match in the RewriteRule.

One final piece of advice: since you have control over the VirtualHost sections in the main Apache configuration, it would be faster to put these rules there. Additionally, you'd split them, putting the plain HTTP one in *:80 and HTTPS in *:443, meaning you can remove the RewriteCond %{HTTPS} =on entirely, since it would only apply to requests intended for that virtual host.

Steve Madsen
My rewrite engine doesn't seem to work, thats what my problem is. :(
Mike Curry
anyway to test if rewrite is working what so ever with a simple test, or even see if my .htaccess is being picked up?
Mike Curry
Vinko is right; this isn't the best way to debug. I'm willing to spend a bit of time debugging this with you over IM. Contact me via my web site (check my profile) if you're interested.
Steve Madsen
sounds good, thanks steve.
Mike Curry
+2  A: 

It sounds like you are saying your mod_rewrite isn't working at all. Here's a few things to try:

You said it was enabled, but the provided info:

root@s15348441:/etc/apache2/mods-available# more rewrite.load
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

Just shows it under the "mods-available" folder, which means it is installed, but not necessarily turned on. If it is enabled, it should be symlinked under the "mods-enabled" folder (you'll need to a2enmod it if it isn't there)

If it is enabled, and has been restarted, the next step would be to enable the logging feature of mod rewrite; this is an excellent tool for debugging.

Edited to add: You could move the mod rewrite to the base config. If you have access to it, it's recommended to put your config in the base section anyway (see here). It's also easier to determine if it has anything to do with mod_rewrite (like your allowoverrides are getting confused) or it's purely an htaccess problem.

Keeping on: (@Vinko Vrsalovic is right about this being a hard debugging medium) If you moved it to your base config and it still didn't work, then we're onto something, you've eliminated .htaccess portion. You should post the new config, along with the rewrite logs. If you didn't get a rewrite log, then 1) your config hasn't been loaded (need to restart apache) or 2) you aren't hitting the config section you think you are

Todd Gardner
I don't think my .htaccess is being read at all ...
Mike Curry
I'll give it a shot today, thanks :D
Mike Curry
Never worked. I am stumped
Mike Curry
+4  A: 

You can easily test if your htaccess is being read or not:

  • Put garbage in it, like:

    Options +FollowSymLinks
    This is garbage
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule (.*) //%1/$1 [L,R=301]
    

    If you get a 500 error (Internal Server Error) then it IS being read.

    If it is, you should enable the RewriteLog in the main server configuration (not in .htaccess) like this:

    RewriteLog "/tmp/rewrite.log"
    RewriteLogLevel 9
    

And then check the file /tmp/rewrite.log to see what's happening. Report back with results.

(Stack Overflow isn't a good debugging medium, IRC is better for that, try #[email protected])

Good luck.

Vinko Vrsalovic
RewriteLogLevel 9 will generate way too much noise to be of much use. 2 or 3 is plenty to understand if the rules are being processed, or why they aren't.
Steve Madsen
I disagree, I routinely use level 9 and, while verbose, I find it useful.
Vinko Vrsalovic
RewriteLog should definitely help in tracking any find of problems. And high output can help track problems easily.
Ivan Vučica
+1  A: 

As Vinko said,

RewriteLog "/tmp/rewrite.log"
RewriteLogLevel 9

and look at that file.

Otherwise, here's the code we're using to redirect from zirconium.zrs.hr/~zatemas to zatemas.zrs.hr:

RewriteEngine on

# For sites running on a port other than 80
RewriteCond %{HTTP_HOST}   !^zatemas\.zrs\.hr [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^/~zatemas/(.*)         http://zatemas.zrs.hr:%{SERVER_PORT}/$1 [L,R]

# And for a site running on port 80
RewriteCond %{HTTP_HOST}   !^192\.168\.1\.24 [NC]
RewriteCond %{HTTP_HOST}   !^zatemas\.zrs\.hr [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteRule ^/~zatemas/(.*)         http://zatemas.zrs.hr/$1 [L,R]

I've seen around the web that people detect HTTPS primarily by looking if the port is 443. mod_rewrite documentation says there should be a variable HTTPS set to on or off, appropriately - I presume you do RewriteCond %{HTTPS} ^on$ to test if it's on.

Also watch out: .htaccess directives for URL rewriting do not work nicely if you're accessing files in user's home directory - for example site.com/~username/. That should not bother you according to your scenario, though. My code above is placed in main server config, under the VirtualHost section(more precisely, in /etc/apache2/sites-enabled/000-default, but that's debian specific and gets merged in main config).

Ivan Vučica
Thanks for the help, its now working :D
Mike Curry
No sweat, just helping where I can :-)
Ivan Vučica
A: 

First of all, check to make sure that mod_rewrite is actually loading. You can do that with apache2ctl:

[root@host ~]# apache2ctl -t -D DUMP_MODULES 2>&1 |grep rewrite
rewrite_module (shared)

If it is not, then you might have to run 'a2enmod rewrite'

Next, test to see if your .htaccess file is even being read. I typically do this by putting some garbage inside the .htaccess file, then loading a page in that directory in my browser and verifying that I get a 500 error

On a side note, as others have mentioned, if you have the ability to modify your Apache config directly, you should put the Rewrite Rules there instead of in the .htaccess file as it is less efficient. Apache has to first decide in which directory to look for the .htaccess file, then read it, then perform the rewrites. If the RewriteRules are specified inside your VirtualHost directives, then it can do them before finding the .htaccess file. Specifying them inside your VirtualHost also means that it doesn't matter if your .htaccess file is being read. It would look something like this:

 <VirtualHost *:80>
    .... existing config ....
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule (.*) http://%1/$1 [L,R=301]
 </VirtualHost>
 <VirtualHost *:443>
    .... existing config ....
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule (.*) https://%1/$1 [L,R=301]
 </VirtualHost>
Brandon
A: 

What are the file permissions for your .htaccess file?

I'm not sure, but I think it needs to be 644.

Dave