RewriteCond %{REQUEST_URI} !/resources/blog
    RewriteCond %{QUERY_STRING} ^start=\d+$
    RewriteRule (.*)       /$1?    [L,R=301,QSD]

    [Sun Apr 28 15:40:02.614893 2024] ... rewrite 'resources/blog' ->
    'index.php'
    [Sun Apr 28 15:40:02.614921 2024] ... internal redirect with
    /index.php [INTERNAL REDIRECT]

    If I don't involve the first RewriteCond, it successfully strips
    off the start= from every URL I tried.

    What does "INTERNAL REDIRECT" mean? Is that something done outside
    of apache? Perhaps by joomla? I believe there are other relevant
    redirects after these, but it's very difficult to isolate what's
    relevant.

The internal redirect is the result of your rewrite rule, without a fully qualified URL as a target.

Side note: the "rewrite 'resources/blog' -> 'index.php'" line seems to contradict your RewriteCond logic, so increasing the verbosity of the logging and looking at the previous lines will help fix that.

I increased it to trace5, and it did reveal more useful info.

[Sun Apr 28 21:55:36.542349 2024] ...  RewriteCond: input='/resources/blog' pattern='!/resources/blog' => not-matched

It looks like after this it just moved on to the next rewriterule, not the next rewritecond as part of this block, of sorts. I was assuming it was more of an AND statement, like "if URI is NOT /resources/blog AND query string contains start=..., then apply the following rewrite rule, but that's apparently not how it works.

I only want the rewrite rule above to apply to URLs that don't involve our blog.

And because the first RewriteCond isn't matched, it doesn't check the second RewriteCond, and therefore treats the RewriteRule as a standalone and not part of the previous RewriteRule, so then just redirects to the root, apparently still with the start= query string attached.

How do I write the logic such that it applies to every URL EXCEPT those I specify?

Reply via email to