Регулярное выражение для исключения папок при перезаписи url

Я переписываю url на .htaccess. Мне нужно написать регулярное выражение, чтобы исключить некоторые папки из правила перезаписи. Я задаю несколько похожих вопросов, но это все равно не работает. Я хочу удалить .php с www.mywebsite.it/page.php, www.mywebsite.it/eng/page.php и www.mywebsite.it/ita/page.php

Вот мои правила:

RewriteRule ^/(?!ita|eng)([A-Za-z0-9\-\+]+).php$ /$1 [R=302,NC]
RewriteRule ita/([A-Za-z0-9\-\+]+).php$ ita/$1 [R=302,NC]
RewriteRule eng/([^x]+).php$ eng/$1 [R=302,NC]

второй и третий работают, но не первый. Что я делаю не так?

Я пробовал много обдумывать, но когда правило работает, оно вступает в противоречие с другими.

ОБНОВИТЬ: вот правила, которые у меня есть:

RewriteRule ^(.*).it$ $1/index.php?lang=it [NC,L]
RewriteRule ^(.*)eng/$ $1/index.php?lang=en [NC,L]

RewriteRule ^ita/([A-Za-z0-9\-\+]+)$ $1.php?lang=it [NC,L]
RewriteRule ^eng/([A-Za-z0-9\-\+]+)$ $1.php?lang=en [NC,L]

Эта часть работает, и я сделал ее для SEO-оптимизации. Теперь мне нужно перенаправить старые URL-адреса сайта (я изменил структуру своего сайта, не меняя домен).

Раньше структура была: www.mywebsite.it/page.html (для итальянского языка) www.mywebsite.it/eng/page.html (для английского)

и новая структура: www.mywebsite.it/ita/newpage.php (итальянский) и www.mywebsite.it/eng/newpage.php (английский).

Итак, я попробовал:

#html to php
RewriteRule (.*).html$ /$1.php [R=302]

Redirect 302 /page.php http://www.mywebsite.it/ita/newpage.php   
Redirect 302 /eng/page.php http://www.mywebsite.it/eng/newpage.php

#remove php
RewriteRule ita/([A-Za-z0-9\-\+]+).php$ ita/$1 [R=302,NC]
RewriteRule eng/([^x]+).php$ eng/$1 [R=302,NC]

Но когда я захожу на eng / page.html, меня перенаправляют на eng / ita / newpage

Затем я подумал, что могу изменить новую структуру и удалить папку ita / для итальянского языка (чтобы все было как можно более похоже на старую структуру, и поэтому мне просто нужно перенаправить «страницу» на «новую страницу», не вмешиваясь в папки ...), но когда я пытаюсь установить правило без ita / или eng /, я получаю конфликты или зацикливаюсь. Вот почему я ищу регулярное выражение, чтобы сказать (что-то, но не ita или eng).

Взгляните на RewriteCond. Это упростит чтение вашего набора кода.

arkascha 10.08.2018 15:12

К тому же похоже, что все, что вам не хватает, - это / в первом правиле.

arkascha 10.08.2018 15:13
1
2
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать это правило, которое объединяет все случаи

RewriteRule ^(ita/|eng/|)([^/]+)\.php$ /$1$2 [R=302,L,NC]

Ваше первое правило не сработало, потому что оно не соответствовало. Действительно, в контексте htaccess нет ведущей косой черты для сопоставления. Также возникла проблема с конфликтом / соответствием из-за вашего отрицательного просмотра вперед ?! и части имени файла.

Обновлять

После вашего обновления вот соответствующий код

# (1) *.html -> *.php
RewriteRule ^(.+)\.html$ /$1.php [R=302,L,NC]

# (2) /page.php to /ita/newpage.php and /eng/page.php to /eng/newpage.php
RewriteRule ^page\.php$ /ita/newpage.php [R=302,L,NC]
RewriteRule ^eng/page\.php$ /eng/newpage.php [R=302,L,NC]

# (3) /ita/page.php or /ita/page (same for eng) and /page.php to /page
RewriteRule ^(ita/|eng/|)([^/]+)\.php$ /$1$2 [R=302,L,NC]

# (4) rewrite to /file.php?lang=xx
RewriteRule ^ita/(.+)$ /$1.php?lang=it [NC,L]
RewriteRule ^eng/(.+)$ /$1.php?lang=en [L,NC]

Примечание: (3) будет бесполезным (за исключением /ita/) из-за (2), который будет соответствовать вместо

Спасибо за ответ! Я пробовал, как вы предложили, но еще один конфликт, потому что у меня есть другой набор URL-адресов после перезаписи в фактический URL-адрес с запросом ... и я предпочитаю хранить три правила разделенными, потому что папка ita / соответствует запросу? Lang = это и англ / это? lang = en. Мне нужно что-то сказать (все, кроме ita или eng) в первом правиле, чтобы все три случая рассматривались по-разному. Надеюсь, я объяснил! Я совсем не эксперт

Margherita Bonaldi 10.08.2018 15:45

Пожалуйста, обновите свой вопрос, указав другие правила, я позабочусь об этом

Justin Iurman 10.08.2018 16:14

Хорошо, я сделал это! Моя проблема на самом деле немного отличается от вопроса, который я задал! Я подумал, что это хороший способ найти решение.

Margherita Bonaldi 10.08.2018 18:23

Странно как-то. Я попытался обновить свой ответ с учетом вашего объяснения, но я не уверен, что получил все об этой схеме URL-адресов спагетти

Justin Iurman 10.08.2018 19:49

Большое спасибо! Работает!! Номер 3 вызывает проблемы, потому что он удаляет .php в фактическом URL-адресе со строкой запроса. Но если я оставлю ita / и eng / разделенными, все в порядке (мне не нужно переписывать page.php на страницу, если работает номер 2). Итак, у меня номер 3: ^ ita /(.+). Php $ ita / $ 1 [R = 302, NC] и ^ eng /(.+). Php $ ita / $ 1 [R = 302, NC]. Я снял флаг L в правилах с номерами 1,2 и 3, потому что он заставляет mod_rewrite прекращать обработку набора правил, я прав? Еще раз спасибо!!!

Margherita Bonaldi 13.08.2018 14:04

Другие вопросы по теме