Это правило должно делать это:
RewriteCond %{REQUEST_URI} !^/dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/(.*) dir/$2/$4?value=$1&anothervalue=$3 [L,QSA]
Внутренние запросы /something/dir2/somethingelse/page.php
будут переписаны на /dir/dir2/page.php?value=something&anothervalue=somethingelse
.
Но это не помешает запросить последнее напрямую, а только разрешить псевдоним.
Перенаправление запросов /dir/dir2/page.php?value=something&anothervalue=somethingelse
извне на /something/dir2/somethingelse/page.php
также возможно с mod_rewrite, но требует немного более сложного правила, поскольку параметры URL могут иметь произвольный порядок:
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)value=([^&]+)&?([^&].*)?$
RewriteCond %3&%1%4 ^([^&]+)&(([^&]*&)*)anothervalue=([^&]+)&?([^&].*)?$
RewriteRule ^dir/([^/]+)/(.*) /%1/$1/%4/$2?%2%5 [L,R=301]
Как видите, это не очень приятно. Лучшим решением будет проверить с помощью PHP, какой URL был запрошен (см. $_SERVER['REQUEST_URI']
) и выполнить перенаправление с помощью PHP (см. header
function ).