Home » Linux » .htaccess not working (mod_rewrite)

.htaccess not working (mod_rewrite)

Posted by: admin November 29, 2017 Leave a comment

Questions:

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:

[email protected]:/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>);
# 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
Answers:

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 example.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).

Questions:
Answers:

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.

Questions:
Answers:

In my case, I changed in httpd.conf:

AllowOverride None

to

AllowOverride All

and it works.

Questions:
Answers:
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.

Questions:
Answers:

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:

[email protected]:/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

Questions:
Answers:

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

[[email protected] ~]# 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> 

Questions:
Answers:

None of the above solutions worked for me. I’m running CentOS using per directory context for apache…no VirtualHosts or anything. Nothing I tried worked until I noticed that NameVirtualHost was on by default in my config…after turning it off everything seems to be working A-OK.

Questions:
Answers:

I had the same problem and this wasted my 5 hours to fix.

So In order to use mod_rewrite you can type the following command in the terminal:

a2enmod rewrite 

Then restart your Apache.

Questions:
Answers:

I had the problem on making mod_rewrite works on my new fresh CentOS 6 installation. Nothing worked for me, until I accidentally saw that there are two AllowOverride inside of httpd.conf. One inside <Directory /> and another one inside <Directory "/var/www/html">. I changed both values to All and then it worked. Hope it helps somebody!

P.S. I didn’t use Virtual Hosts

Questions:
Answers:

I’ve had a similar problem..Mod Rewrite enabled, .htaccess permissions are correct, AllowOverride set to All but .htaccess not being read. After hours of pain and searching for an answer this is what my problem was: (hope this helps anyone)

I’ve had another virtual host’s site enabled besides the one I was testing and it shared a common Directory root (/var/www) and AllowOverride was set to none for the other site. Solution was simply to disable the other site with “a2dissite”

Questions:
Answers:

How about this rewrite rule?

RewriteEngine On RewriteCond %{HTTP_HOST} ^www.example.com$ [NC] RewriteRule ^(.*)$ http://example.com/$1 [R=301,L] 

Questions:
Answers:

For me, a symlink was missing

ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load 

Questions:
Answers:

Try this little trick:

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

Questions:
Answers:

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] 

Questions:
Answers:

What are the file permissions for your .htaccess file?

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

Questions:
Answers:

I had similar problem, this is what worked for me.

In your httpd.conf, under virtual hosts, make sure you have both:

ServerName domain.com

ServerAlias www.domain.com

BOTH in VirtualHost *:80 AND VirtualHost *:443