2015-02-20 3 views
0

У меня есть следующие .htaccess mod_rewrite правила:Mod_rewrite: Different поведение на разных системах

RewriteEngine on 
RewriteRule ^(abc1|abc2|abc3|abc-defg)/([^/]+)$ /redirect/category/$1/$2 
RewriteRule ^(.+[^/])/$  /$1 [R=301,L] 

Теперь у меня есть следующий URL:

http://www.example.com/abc-defg/cat1/ 

, который должен быть сопоставлен

http://www.example.com/redirect/category/abc-defg/cat1 

Это правило работает на моей локальной машине-разработчике (Win7, Xampp), но не на рабочем сервере (работает Ubuntu 12 .04 с Apache, mod_rewrite и mod_fcgid).

На Ubuntu я перенаправляюсь на http://www.example.com/abc-defg/cat1 (удалено «/», что является вторым правилом).

Как я могу узнать, почему он не работает должным образом?

+0

Хорошо, я разрешу перенаправление на стороне php (поскольку это только для «старых» URL-адресов). – bernhardh

ответ

0

Вы должны поместить 301 правила переадресации перед первым правилом:

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+[^/])/$ /$1 [R=301,L,NE] 

RewriteRule ^(abc1|abc2|abc3|abc-defg)/([^/]+)$ /redirect/category/$1/$2 [L,NC] 

проверить это в новом окне браузера.

+0

Нет, это не решение. Первый переписывается для старых URL-адресов (мы делаем перезапуск), а второй - для предотвращения дублирования контента. Это не имеет значения, даже если я прокомментирую seond one ('RewriteRule^(. + [^ /])/$/$ 1'), он не работает должным образом на Ubuntu. – bernhardh

+0

Действительно ли '/ abc-defg/cat1' является реальным каталогом на Ubuntu? Сначала проверьте, читается ли этот .htaccess на Ubuntu, помещая в него какой-то случайный текст и выясняя, генерирует ли он 500 или нет. – anubhava

+0

Как я уже сказал, этот файл читается и используется, так как работает второе регулярное выражение. – bernhardh

0

Ваше регулярное выражение не совпадает.

Попробуйте это:

^(abc1|abc2|abc3|abc-defg)/([^/]+)/?$

Вам необходимо уточнить, что это может закончиться с косой чертой. Или, альтернативно (но не рекомендуется), не заканчивайте его косой чертой.

www.example.com/abc-defg/cat1 действительно соответствует регулярному выражению, поэтому я предполагаю, что это то, что вы использовали раньше.

Это означает, что вполне возможно, что пользователь поставит косую черту в конце, поэтому лучше всего ее учитывать.

+0

Вы совершенно правы! Я не знаю, как это может работать на моей dev maschine, но регулярное выражение было неправильным. Но теперь я могу использовать версию с/и она работает, но она не работает без конца /, каких-либо идей? – bernhardh

+0

И вторая странная вещь, если я использую^(abc1 | abc2 | abc3 | abc-defg)/([^ /] +) $, она не работает с/abc-defg/cat: O – bernhardh

+0

странный , отделка? должен предусматривать отсутствие/в конце. Тестирование на этом сайте: http://martinmelin.se/rewrite-rule-tester/ показывает, что оно работает. – Scironic

Смежные вопросы