Search code examples
regex.htaccessurl-rewriting

redirect rule removing slash randomly


For some reason, on some rules the / is removed. I have more rules than this but for the first one in this case it will work correctly but the second one which could be anywhere in the list of rules, redirects to https://www.example.comnot-working-url instead of https://www.example.com/not-working-url. If this happened for all it would perhaps make more sense but it only does this for some urls. Why would this be?

RewriteEngine On
RewriteCond %{QUERY_STRING} .
RewriteRule ^en/(.*) /$1 [L,NE,R=301]

Redirect 301 /en/working-url https://www.example.com/working-url
Redirect 301 /en/not-working-url https://www.example.com/not-working-url

Solution

  • You likely have a "catch-all" Redirect directive that is missing the trailing slash.

    For example, if you have the following at the end of your rules:

    Redirect 301 / https://www.example.com
    

    Note the missing trailing trailing slash on the target URL.

    Then a request for /not-working-url would be "erroneously" redirected to https://www.example.comnot-working-url by the above rule.

    The Redirect directive is prefix matching and everything after the match is copied onto the end of the target URL. So, in the case of the above rule, not-working-url (after the initial / that matches) is copied onto the end of https://www.example.com. With the Redirect directive, the trailing slash should nearly always match on the source and target URLs, otherwise you'll likely get missing slashes or double slashes in the redirect response.


    RewriteCond %{QUERY_STRING} .
    RewriteRule ^en/(.*) /$1 [L,NE,R=301]
    
    Redirect 301 /en/working-url https://www.example.com/working-url
    Redirect 301 /en/not-working-url https://www.example.com/not-working-url
    

    Without further explanation, these rules don't make too much sense. The RewriteRule directive removes the /en prefix (when a query string is present), so the Redirect directives that follow would not match?