.htaccess как "игнорировать" несуществующую часть (папку c файлом - их нет) url?

Суть в том, что был перенесён сайт, но нужно сохранить старые ссылки. Раньше мультиязычность была организована влоб - в каждой папке свой язык, пример (fr язык):

/french/index.php
/french/about.php
// и другие файлы в папке french, english, etc...

Теперь мультиязычность сделана отдельным модулем, независимым от расположения файлов. Соответственно, были убраны все лишние файлы и папки.

Но появилась и проблема - как сделать чтобы по уже не существующим старым ссылкам открывались файлы с корня? примеры

// ссылка в браузере:
/french/index.php
// -> файл /index.php

// ссылка в браузере:
/french/about.php
// -> файл /about.php

Самый простой не работающий вариант выглядел так:

RewriteEngine On

RewriteRule ^(.*)/(.*)\.php $2.php?lng=$1 [L]

Пробовал уже много чего, пока так и не приблизился к решению.


Ответы (3 шт):

Автор решения: Crawk

Добавляешь эту строку

RewriteCond %{REQUEST_URI} !^/твой файл\.расширение$
→ Ссылка
Автор решения: puffleeck

попробуй например в /franch/ закинуть ht* с единственным правилом - ErrorDocument 404 ../(.*) а после щупать ссылки френча. мб поможет, но это не точно.

насколько помню, при использовании относительных ссылок в ED* они работают не как redirect а как include. т.е. загружается URL указанный в правиле, но в строке браузера остается ошибочный

за пределами этой папки данное 404 правило работать конечно не должно, там уже корневой htaccess будет править баллом.


еще в качестве временного костыля можно прицепить примитивный js цикл с innerHTML, который будет на лету заменять url в ссылках по регулярке.


p.s. в spa-js фреймворках можно подключить роутинг, как впрочем и в ванильном js через history api. но по части js роутинга я ваще мало что знаю, так что, мне тут подсказать особо нечего.

https://ru.vuejs.org/v2/guide/routing.html

→ Ссылка
Автор решения: Daniil Loban

Настроил на своем сервере таким образом (добавил флаг R):

# Header set Content-Security-Policy "default-src 'self'; img-src https: data:;"

Options -Indexes

RewriteEngine On

RewriteRule ^(.*)/(.*)\.php /$2.php?lng=$1 [R,L]

ErrorDocument 404 /custom-404.php

результат:

введите сюда описание изображения

можно посмотреть:

http://daniil-loban.42web.io/french/index.php

http://daniil-loban.42web.io/french/about.php

(ссылки будут удалены после принятия или отклонения ответа)

Использование флага [R] вызывает перенаправление HTTP в браузер. Если указан полный URL-адрес (то есть включающий http://имя_сервера/), то будет выполнено перенаправление на это место. В противном случае текущий протокол, имя сервера и номер порта будут использоваться для создания URL-адреса, отправляемого с перенаправлением.

Можно указать любой действительный код состояния ответа HTTP, используя синтаксис [R=305], при этом по умолчанию используется код состояния 302, если он не указан. Указанный код состояния не обязательно должен быть кодом состояния перенаправления (3xx). Однако если код состояния выходит за пределы диапазона перенаправления (300–399), то строка замены полностью отбрасывается, а перезапись останавливается, как если бы использовалась буква L.

В дополнение к кодам состояния ответа вы также можете указать статус перенаправления, используя их символические имена: временный (по умолчанию), постоянный или см. другие.

Вы почти всегда будете использовать [R] в сочетании с [L] (то есть использовать [R,L]), потому что сам по себе флаг [R] добавляет http://thishost[:thisport] к URI. , но затем передает это следующему правилу в наборе правил, что часто может приводить к предупреждениям «Недопустимый URI в запросе».

→ Ссылка