How do I troubleshoot why my rewrite rules aren't being applied by apache?
Solution 1
Trying to answer your question: To debug Apache operation you can adjust the LogLevel to a lower level (maybe debug
). But even if you put debug
if you disable the Log for the module in question you dont get any messages from it. For instance, the default [RequestLogLevel][2]
is 0, e.g., the module dont write any messages. I see you setted it to 3 but like RoBorg said change it to 9
that maybe is too low for your case.
Trying to sove your problem: Try to change the way you rewrite the hostname using the inverse form - look if the hostname is what you want and, if not, change it to the hostname you want. Like stated in the URL Rewriting Guide - Apache HTTP Server at the Apache Site:
Canonical Hostnames
Description: The goal of this rule is to force the use of a particular hostname, in preference to other hostnames which may be used to reach the same site. For example, if you wish to force the use of www.example.com instead of example.com, you might use a variant of the following recipe. Solution:
# To force the use of RewriteEngine On RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] RewriteCond %{HTTP_HOST} !^$ RewriteRule ^/(.*) http://www.example.com/$1 [L,R]
In their example, they change from example.com
to www.example.com
but you got the idea. Just adjust it for your case.
Solution 2
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
RewriteRule ^(.*)$ "http\:\/\/domain\.com\/$1" [R=301,L]
</IfModule>
Had the same problem with my server, but this worked
Myron Marston
Updated on August 11, 2022Comments
-
Myron Marston over 1 year
I've got a tomcat 6 web app running with apache httpd as the front end. I'm using mod_proxy and mod_proxy_ajp to forward the requests to tomcat. My server is running ubuntu. Now I'm trying to use mod_rewrite to remove the leading www, so that my canonical website url is http://domain.com rather than http://www.domain.com
I've read a number of tutorials on using mod_rewrite, but I can't get any rewriting to work. I've tried putting the rewrite rule in an .htaccess file (after modifying my /etc/apache/sites-available/default file to set AllowOverride all). I've tried putting the rewrite rule in apache2.conf, httpd.conf, and rewrite.conf. I've tried all of these with rewrite logging turned on. The log file gets created, but apache has written nothing to it. I thought maybe mod_proxy was somehow preventing the rewrite rules from being used, so I tried disabling that as well...and I still get no rewrite, and nothing to the log.
At this point I have absolutely no idea what to try next. How do I go about troubleshooting why apache isn't using my rewrite rules?
For reference, here are my rewrite directives:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC] RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L] RewriteLog "/var/log/apache2/rewrite.log" RewriteLogLevel 3 </IfModule>
Edit: the responses below are helpful to my particular case, but probably not as helpful to the community-at-large as answers about how you troubleshoot apache directives in general. For example, is there a way to enable logging to the point where it would tell me which directives are being applied in which order as the request comes in?
Edit 2: I've gotten things to work now. My virtual hosts weren't quite set up right, and I also didn't quite have the rewrite regex right. Here is the final rewrite directives I got to work:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC] RewriteRule ^(.*)$ http://domain.com$1 [L,R=301] </IfModule>
-
Myron Marston over 15 yearsGood suggestion, but I'm still not seeing either the rewriting working or anything in the log.
-
Myron Marston over 15 yearsI've tried placing these in my /etc/apache2/apache2.conf, /etc/apache2/httpd.conf, /etc/apache2/mods-available/rewrite.conf (which is symlinked from /etc/apache2/mods-enabled). My understanding is that these rules will always apply. I'm only running one domain/virtual host here.
-
Myron Marston over 15 yearsI tried your suggestion, and apache complains about including the port 80 part (:80): [error] VirtualHost *:80 -- mixing * ports and non- ports with a NameVirtualHost address is not supported, proceeding with undefined results. I took out the port number, and it restarted fine, but no redirect.
-
Vinko Vrsalovic over 15 yearsEscaping the dot character will not make a difference in this case
-
Vinko Vrsalovic over 15 yearsThis is a case more appropriate for IRC than for Stack Overflow. There are many configurations to debug. Try #apache on irc.freenode.net if none of the suggestions here work.
-
John Nilsson over 15 yearsThe dot will still match a dot even if an escaped dot would only match an actual dot an unescaped dot will match anything including the dot the dot was supposed to match.