Solution: Switching to rewrite rules, removing index.php from URLs and redirecting old requests

About

You will need some mod_rewrite rules set up in Apache. Generally, these should be added to the VirtualHost configuration.

Example

A basic set looks like this:

RewriteRule ^/var/storage/.* $0 [L] 
RewriteRule ^/var/[^/]+/storage/.* $0 [L] 
RewriteRule ^/design/[^/]+/(stylesheets|images|javascripts?)/.* $0 [L] 
RewriteRule ^/share/icons/.* $0 [L] 
RewriteRule ^/extension/[^/]+/design/[^/]+/(stylesheets|images|javascripts?)/.* $0 [L] 
RewriteRule .* /index.php

(Taken from Jan Borsodi's comment here)

Secondly, you will probably need to add the ForceVirtualHost setting in settings/override/site.ini.append.php. eZ can allegedly detect when it is installed in a virtual host setup, but it's not always correct.

[SiteAccessSettings]
ForceVirtualHost=true

Redirect old url conventions/patterns

If you're switching from a setup where index.php is occuring in the URL, to a rewrite rule based setup, you can make sure any old links are properly redirected (with HTTP status MOVED PERMANENTLY) to the new URL without index.php. Put this in the appropriate virtual host context of your Apache configuration:

RewriteRule ^/index\.php/(.*)$ /$1 [L,R=301]

Reference