2

My desired result is change a file to root / from a N number of paths.

For example: www.host.com/a/b/c/e/f/g/images/1.jpg, where A~G is not always given. Result: www.host.com/images/1.jpg.

This is what I have so far: www.host.com/a/images --> www.host.com/images using: RewriteRule ^a\/images/$ images/$1 [L].

What I need is a wildcard in front of /images/ like this: RewriteRule ^*\/images/$ images/$1 [L].

How can I do this correctly in .htaccess?

2 Answers 2

1
RewriteRule ^a\/images/$ images/$1 [L]

There is no capturing group in the RewriteRule pattern, so the $1 backreference is always empty and will only rewrite the request from /a/images/ to /images/ (note the trailing slash).

To rewrite a request to any path depth then you simply need to establish that there is something (even just 1 character) in the URL-path before /images/ in the requested URL.

Taking the above points into consideration you could do something like the following:

RewriteRule ./(images/.*) $1 [L]

The $1 backreference contains everything that we want to rewrite the request to. ie. images/<anything>.

The above would internally rewrite a request for /a/b/c/e/f/g/images/<anything> to /images/<anything>.

0

This should do the trick: RewriteRule ^.+\/images/$ images/$1 [L]

In regex, the .+ is a wildcard matching at least one character, so it will match

www.host.com/**a**/images and www.host.com/**a/b**/images but not www.host.com/images.

When working with regular expressions for pattern matching, I have always found this page helpful: http://regular-expressions.info/.

1
  • This only matches .../images/ - it does not match the filename. And since there is no capturing group in the RewriteRule pattern, the $1 backreference in the substitution string is always empty.
    – MrWhite
    Oct 20, 2021 at 14:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.