Перенаправление htaccess 301 с использованием регулярного выражения - PullRequest
0 голосов
/ 20 июля 2011

Это мой текущий файл .htaccess

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ $1/


RewriteRule ^([^/]+)/$ index.php?p1=$1 [L]
RewriteRule ^([^/]+)/([^/]+)/$ index.php?p1=$1&p2=$2 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ index.php?p1=$1&p2=$2&p3=$3 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ index.php?p1=$1&p2=$2&p3=$3&p4=$4 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5 [L]

Обычно требуется до пяти «Папок с дружественными URL-адресами» и присваивается значение переменным, а затем отправляется на мою страницу index.php * 1004.*

IE: http://www.example.com/ford/focus/grey/

$p1 = 'ford';
$p2 = 'focus';
$p3 = 'grey';
$p3 = 'grey';

Пока все хорошо.

Теперь мне нужно интегрировать инструкцию 301 (RegExp?) В тот же .htaccess, потому что изначально у меня были такие параметры GET:

IE: http://www.example.com/ford/focus/grey/?lang=fr

Мне нужно избавиться от всех переменных GET, потому что Google видит их как дублированный контент (даже если я использую атрибут nofollow в ссылках на языки)

IE: http://i.want.to.keep/my/url/?AND_DUMP_GET_VARIABLES

http://www.example.com/ford/focus/grey/?lang=fr
http://www.example.com/ford/focus/grey/?lang=en
http://www.example.com/ford/focus/grey/?lang=sp
==> http://www.example.com/ford/focus/grey/

Логически инструкцияследует интерпретировать между первым и вторым блоком, но я просто не знаю, с чего начать.Есть намеки?

СПАСИБО!

1 Ответ

0 голосов
/ 21 июля 2011

Как я понимаю, вы хотите избавиться от строки QUERY STRING и перенаправить (301 Permanent Redirect) на тот же URL-адрес, но без строки QUERY STRING.

Правило ниже будет перенаправлять КАЖДЫЙ запрос, содержащий строку запроса:

RewriteCond %{QUERY_STRING} !^$
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1? [R=301,L]

1. ? сделает волшебство - удалит строку запроса

2. Вам крайне нужна эта строка: RewriteCond %{ENV:REDIRECT_STATUS} ^$. Проблема в том, что он может не работать в вашей настройке Apache, и я не могу дать вам то, что именно вам нужно, чтобы он работал (он отлично работает на моем ванильном Apache v2.2.17 в Windows).

После того как произошло перезапись (внутреннее перенаправление), он переходит к следующей итерации, и Apache снова начинает сопоставлять все правила сверху, но для уже переписанного URL. Если мы не добавим вышеупомянутую строку, то mod_rewrite применит вышеупомянутое правило к переписанной форме URL, и вы получите все URL-адреса, которые будут переписаны в /index.php без каких-либо параметров.

Если вышеприведенное не сработает, попробуйте следующий код:

# do not do anything for already existing files and folders
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]

RewriteCond %{QUERY_STRING} !^$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1? [R=301,L]

С помощью правила # do not do anything for already existing files and folders mod_rewrite прекратит переписывание после того, как URL будет переписан в формат /index.php?p1=....

В случае, если вышеперечисленное не будет работать вообще (лучше - в дополнение к вышеизложенному - я бы все равно предложил добавить это), используйте <link rel="canonical" href="FULL_PROPER_RUL"/> на своей странице:

...