чистый URL с помощью .htaccess

Я пытаюсь перенаправить ссылки на свой домен. Чего я пытаюсь добиться, так это: когда пользователь нажимает ссылку на

mydomain.com/index.php?dir=myfolder

Я хочу, чтобы он был перенаправлен именно на этот URL-адрес, но панель браузера должна отображать этот URL-адрес:

mydomain.com/myfolder

Поскольку у меня нет доступа к тому, как устанавливаются ссылки (это php-сайт), я пытаюсь сделать это только с файлом .htaccess.

Вот что у меня есть:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} subdomain.mydomain.com
RewriteCond %{REQUEST_URI} (.*)/style.css [OR]
RewriteCond %{REQUEST_URI} (.*)/script.js [OR]
RewriteCond %{REQUEST_URI} (.*)/logo.png
RewriteRule (.*) http://www.subdomain.com%{REQUEST_URI} [R=301,NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?dir=$1 [L]

Поэтому, когда я ввожу "mydomain.com/myfolder" в браузер, он работает нормально, и URL-адрес в адресной строке остается таким. Но когда я ввожу "mydomain.com/index.php?dir=myfolder", он тоже работает, но URL-адрес также остается прежним (а это не то, что мне нужно). Я предполагаю, что мне нужно как-то изменить URL-адрес с .htaccess-файлом, а затем (как я уже сделал) переписать его на php-схему. Я сделал несколько подходов сейчас, но я понятия не имею, как это сделать. Я надеюсь, что вы понимаете мой вопрос и можете мне помочь!

Спасибо!

EDIT:

Решение (спасибо @anubhava):

RewriteEngine on
RewriteBase /

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?dir=([^\s]+) [NC]
RewriteRule ^ %1? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?dir=/$1 [L]

person basbebe    schedule 19.10.2012    source источник


Ответы (3)


Просто добавьте это правило в конец существующего файла .htaccess:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?dir=([^\s]+) [NC]
RewriteRule ^ %1? [R=301,L]
person anubhava    schedule 19.10.2012
comment
Большое тебе спасибо! Я поставил этот код до того, как RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php?dir=/$1 [L] работает отлично! - person basbebe; 19.10.2012

Я думаю, ваш вопрос касается перенаправления /index.php?dir=example на /example. В приведенном ниже примере выполняется постоянное перенаправление:

RewriteRule ^index\.php\?dir=?$ /$1 [NC,R=301,L]
person Fenton    schedule 19.10.2012
comment
Это то, что я пытаюсь сделать, да. Но и этот код (может не туда вставил) тоже не работает, не меняет URL в адресной строке... - person basbebe; 19.10.2012
comment
Этот код не будет работать, потому что RewriteRule не может сопоставить строку запроса, он используется для сопоставления только части URI (без строки запроса). - person anubhava; 19.10.2012

Чтобы преобразовать URL-адреса формата mydomain.com/index.php?dir=myfolder в формат mydomain.com/myfolder, попробуйте следующее правило перезаписи в файле .htaccess:

RewriteEngine on
RewriteRule ^([^/\.]+)/?$ /index.php?dir=$1 [L]
person Aamir    schedule 19.10.2012
comment
Проблема остается: URL-адрес в адресной строке браузера остается mydomain.com/index.php?dir=myfolder - person basbebe; 19.10.2012