On Thu, Jul 11, 2024 at 6:55 AM Konstantin Kolinko <knst.koli...@gmail.com> wrote:
> чт, 13 июн. 2024 г. в 17:41, Dave Wreski <dwre...@guardiandigital.com > .invalid>: > > > > Hi, > > > > Some time ago I requested help with a rewrite rule to strip trailing > slash(es) from all URLs in our joomla website, but I'm still having > problems. This is the rule I am currently working with: > > > > RewriteRule ^(.*)/+$ https://linuxsecurity.com$1 [R=301,L] > > > > It works fine for any URL other than the homepage. Somehow for the > homepage it creates an infinite loop, despite using "L", so perhaps I don't > understand what it's doing. The (.*) is supposed to match any character, > but there wouldn't be any preceding elements for the homepage. > > > > The problem as I see it is that, for the homepage, (.*) would be null, > so $1 would also be null? This then creates the same URL as the one we're > trying to fix. > > (.*) means "any character, 0 or more times". > "0 times" here means that it matches an empty string. (Technically, it > is an empty string, not null). > > URL for the home page is "/". > > (The first line of an HTTP 1.x request will be "GET / HTTP/1.1". > By definition of the protocol, there has to be some text between the > verb (GET) and the version.) > > A possible solution that I see is to make the first '/' explicit. > adding it both to the regexp and to the replacement string: > > RewriteRule ^/(.*)/+$ https://linuxsecurity.com/$1 [R=301,L] > > Alternatively, use '+' instead of '*' (meaning 1 or more times): > > RewriteRule ^(.+)/+$ https://linuxsecurity.com$1 [R=301,L] > > Best regards, > Konstantin Kolinko > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@httpd.apache.org > For additional commands, e-mail: users-h...@httpd.apache.org > > You're missing a key part of the engine here; in the per-directory context, the leading / cannot be matched. Per-directory means either .htaccess, <Directory> or <Location>. To make the rule work in both server and per-directory context, use the conditional modifier: ^/?(<pattern>) To stop loops, add a proper RewriteCond directive prior, and exclude whatever URI you need.