How to debug .htaccess redirects?


Dec 19, 2021
Ukraine, Donetsk
cPanel Access Level
Root Administrator
Hi! I'm relatively new to WHM and I have a problem, I need to eliminate 301 redirects chain I have now.
E.g. I need to point "" to "" in one 301 redirect (it's possible, I did it a lot of times but on shared/VPS hostings).
So I need to make HTTP to HTTPS, non-www, replace all characters to lowercase, eliminate multiple slashes and add trailing slash if it's absent.

I have some Rewrite in .htaccess, but I don't know how can I debug it.
I used OpenLiteSpeed before, and it has rewrite logging.
I tried enable logging with LogLevel debug for domain using this manual, but it doesn't output redirection-related things.
So my question is more about "where I can see Apache rewrite logs?"

I'm using WHM v100.0.5 on CentOS v7.9.2009.
Server Version: Apache/2.4.52 (cPanel) OpenSSL/1.1.1m mod_bwlimited/1.4
Server MPM: prefork


Dec 19, 2021
Ukraine, Donetsk
cPanel Access Level
Root Administrator
Hello! I am happy you found a solution. Which redirect rules were you curious about?
Hi Anthony! Thanks for the reply.

I want to know where does some default redirects come from. Now I have basic WHM installation (I did not touch apache, except memcached installed).

I have this configuration in .htaccess file:
Apache config:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond expr "tolower(%{REQUEST_URI}) =~ /(.*)/"
RewriteRule [A-Z] %1 [R=301,L]

# Below is the default W3 Total Cache and Wordpress config (just for your information). Also PHP handler is just at the end (is it ok?)

# BEGIN W3TC Browser Cache
<IfModule mod_mime.c>
    AddType text/css .css
    AddType text/x-component .htc
    AddType application/x-javascript .js
    AddType application/javascript .js2
    AddType text/javascript .js3
    AddType text/x-js .js4
    AddType video/asf .asf .asx .wax .wmv .wmx
    AddType video/avi .avi
    AddType image/avif .avif
    AddType image/avif-sequence .avifs
    AddType image/bmp .bmp
    AddType application/java .class
    AddType video/divx .divx
    AddType application/msword .doc .docx
    AddType application/ .eot
    AddType application/x-msdownload .exe
    AddType image/gif .gif
    AddType application/x-gzip .gz .gzip
    AddType image/x-icon .ico
    AddType image/jpeg .jpg .jpeg .jpe
    AddType image/webp .webp
    AddType application/json .json
    AddType application/ .mdb
    AddType audio/midi .mid .midi
    AddType video/quicktime .mov .qt
    AddType audio/mpeg .mp3 .m4a
    AddType video/mp4 .mp4 .m4v
    AddType video/mpeg .mpeg .mpg .mpe
    AddType video/webm .webm
    AddType application/ .mpp
    AddType application/x-font-otf .otf
    AddType application/ ._otf
    AddType application/vnd.oasis.opendocument.database .odb
    AddType application/vnd.oasis.opendocument.chart .odc
    AddType application/vnd.oasis.opendocument.formula .odf
    AddType application/ .odg
    AddType application/vnd.oasis.opendocument.presentation .odp
    AddType application/vnd.oasis.opendocument.spreadsheet .ods
    AddType application/vnd.oasis.opendocument.text .odt
    AddType audio/ogg .ogg
    AddType video/ogg .ogv
    AddType application/pdf .pdf
    AddType image/png .png
    AddType application/ .pot .pps .ppt .pptx
    AddType audio/x-realaudio .ra .ram
    AddType image/svg+xml .svg .svgz
    AddType application/x-shockwave-flash .swf
    AddType application/x-tar .tar
    AddType image/tiff .tif .tiff
    AddType application/x-font-ttf .ttf .ttc
    AddType application/ ._ttf
    AddType audio/wav .wav
    AddType audio/wma .wma
    AddType application/ .wri
    AddType application/font-woff .woff
    AddType application/font-woff2 .woff2
    AddType application/ .xla .xls .xlsx .xlt .xlw
    AddType application/zip .zip
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/css A31536000
    ExpiresByType text/x-component A31536000
    ExpiresByType application/x-javascript A31536000
    ExpiresByType application/javascript A31536000
    ExpiresByType text/javascript A31536000
    ExpiresByType text/x-js A31536000
    ExpiresByType video/asf A31536000
    ExpiresByType video/avi A31536000
    ExpiresByType image/avif A31536000
    ExpiresByType image/avif-sequence A31536000
    ExpiresByType image/bmp A31536000
    ExpiresByType application/java A31536000
    ExpiresByType video/divx A31536000
    ExpiresByType application/msword A31536000
    ExpiresByType application/ A31536000
    ExpiresByType application/x-msdownload A31536000
    ExpiresByType image/gif A31536000
    ExpiresByType application/x-gzip A31536000
    ExpiresByType image/x-icon A31536000
    ExpiresByType image/jpeg A31536000
    ExpiresByType image/webp A31536000
    ExpiresByType application/json A31536000
    ExpiresByType application/ A31536000
    ExpiresByType audio/midi A31536000
    ExpiresByType video/quicktime A31536000
    ExpiresByType audio/mpeg A31536000
    ExpiresByType video/mp4 A31536000
    ExpiresByType video/mpeg A31536000
    ExpiresByType video/webm A31536000
    ExpiresByType application/ A31536000
    ExpiresByType application/x-font-otf A31536000
    ExpiresByType application/ A31536000
    ExpiresByType application/vnd.oasis.opendocument.database A31536000
    ExpiresByType application/vnd.oasis.opendocument.chart A31536000
    ExpiresByType application/vnd.oasis.opendocument.formula A31536000
    ExpiresByType application/ A31536000
    ExpiresByType application/vnd.oasis.opendocument.presentation A31536000
    ExpiresByType application/vnd.oasis.opendocument.spreadsheet A31536000
    ExpiresByType application/vnd.oasis.opendocument.text A31536000
    ExpiresByType audio/ogg A31536000
    ExpiresByType video/ogg A31536000
    ExpiresByType application/pdf A31536000
    ExpiresByType image/png A31536000
    ExpiresByType application/ A31536000
    ExpiresByType audio/x-realaudio A31536000
    ExpiresByType image/svg+xml A31536000
    ExpiresByType application/x-shockwave-flash A31536000
    ExpiresByType application/x-tar A31536000
    ExpiresByType image/tiff A31536000
    ExpiresByType application/x-font-ttf A31536000
    ExpiresByType application/ A31536000
    ExpiresByType audio/wav A31536000
    ExpiresByType audio/wma A31536000
    ExpiresByType application/ A31536000
    ExpiresByType application/font-woff A31536000
    ExpiresByType application/font-woff2 A31536000
    ExpiresByType application/ A31536000
    ExpiresByType application/zip A31536000
<IfModule mod_deflate.c>
        AddOutputFilterByType DEFLATE text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/html text/richtext text/plain text/xsd text/xsl text/xml image/bmp application/java application/msword application/ application/x-msdownload image/x-icon application/json application/ video/webm application/ application/x-font-otf application/ application/vnd.oasis.opendocument.database application/vnd.oasis.opendocument.chart application/vnd.oasis.opendocument.formula application/ application/vnd.oasis.opendocument.presentation application/vnd.oasis.opendocument.spreadsheet application/vnd.oasis.opendocument.text audio/ogg application/pdf application/ image/svg+xml application/x-shockwave-flash image/tiff application/x-font-ttf application/ audio/wav application/ application/font-woff application/font-woff2 application/
    <IfModule mod_mime.c>
        # DEFLATE by extension
        AddOutputFilter DEFLATE js css htm html xml
<FilesMatch "\.(css|htc|less|js|js2|js3|js4|CSS|HTC|LESS|JS|JS2|JS3|JS4)$">
    FileETag MTime Size
    <IfModule mod_headers.c>
        Header unset Set-Cookie
<FilesMatch "\.(html|htm|rtf|rtx|txt|xsd|xsl|xml|HTML|HTM|RTF|RTX|TXT|XSD|XSL|XML)$">
    FileETag MTime Size
<FilesMatch "\.(asf|asx|wax|wmv|wmx|avi|avif|avifs|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|webp|json|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|webm|mpp|otf|_otf|odb|odc|odf|odg|odp|ods|odt|ogg|ogv|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|_ttf|wav|wma|wri|woff|woff2|xla|xls|xlsx|xlt|xlw|zip|ASF|ASX|WAX|WMV|WMX|AVI|AVIF|AVIFS|BMP|CLASS|DIVX|DOC|DOCX|EOT|EXE|GIF|GZ|GZIP|ICO|JPG|JPEG|JPE|WEBP|JSON|MDB|MID|MIDI|MOV|QT|MP3|M4A|MP4|M4V|MPEG|MPG|MPE|WEBM|MPP|OTF|_OTF|ODB|ODC|ODF|ODG|ODP|ODS|ODT|OGG|OGV|PDF|PNG|POT|PPS|PPT|PPTX|RA|RAM|SVG|SVGZ|SWF|TAR|TIF|TIFF|TTF|TTC|_TTF|WAV|WMA|WRI|WOFF|WOFF2|XLA|XLS|XLSX|XLT|XLW|ZIP)$">
    FileETag MTime Size
    <IfModule mod_headers.c>
        Header unset Set-Cookie
<IfModule mod_headers.c>
    Header set Referrer-Policy "no-referrer-when-downgrade"
# END W3TC Browser Cache

# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

# php -- BEGIN cPanel-generated handler, do not edit
# Set the “ea-php74” package as the default “PHP” programming language.
<IfModule mime_module>
  AddHandler application/x-httpd-ea-php74 .php .php7 .phtml
# php -- END cPanel-generated handler, do not edit
So, for now "" going through this redirection chain:
"" => "" => ""

I just don't understand where the slashes stripping coming from in the first redirection, the 2nd one seems like a Canonical Hostname or something like that, which is related to apache httpd.conf file as I guess.
I have a lot of commented out rules in my .htaccess too - if I uncomment them, I have either 400 bad request in the end, or just "Too many internal redirects error":
Apache config:
RewriteEngine On

#just before all other rules listed above

# RewriteCond %{HTTPS} !=on [OR]
# RewriteCond %{HTTP_HOST} www\.example\.com [NC]
# RewriteRule ^{REQUEST_URI}[R=301,PT]

# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{HTTPS} off
# RewriteRule ^{REQUEST_URI}[R=301]

# RewriteCond %{HTTP_HOST} www\.example\.com
# RewriteRule ^{REQUEST_URI}[R=301,L]

# Rule 1: remove multiple leading slashes (directly after the TLD)
# RewriteCond %{THE_REQUEST} \s/{2,}
# RewriteRule (.*) $1 [R=301,PT]

# Rule 2: remove multiple slashes in the requested path
# RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
# RewriteRule (.*) %1/%2 [R=301,PT]

#if I uncomment any of these, the issues happens
Also I'm tried to use [PT] flags instead of [L] - coz I have mod_alias and mod_userdir installed and read that sometimes I need PT flag, but it seems it become even worse with it. Now I feel myself a bit like a code monkey ;D

Is there a way to move all redirects either in the place where it occurs for every domain registered in WHM (that will be fine in my case),or just disable any redirects and put them all in .htaccess (like I did when I was working with some shared hostings)?