Перепишите дефисированный URL в регистр паскалей, используя apache mod_rewrite

Дружественные URL-адреса должны быть дефисами, например:

http://example.com/some-category/some-file

Однако моя наследуемая структура папок выполнена в паскалях, поэтому переписанный URL должен выглядеть следующим образом:

http://example.com/SomeCategory/SomeFile.php

Примечание. Количество слов в категории или имени файла может быть разным, поэтому не ожидайте согласованности таким образом. ех. http://example.com/some-long-category/file,

Мне интересно, как это сделать, с общей парой условие-правило перезаписи для любой категории и файла, используя Apache mod_rewrite.

Вы можете проверить свои правила здесь, без необходимости настройки сервера Apache.

2 ответа

Решение

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

Насколько я понимаю, mod_rewrite зацикливается до тех пор, пока URL не изменится, поэтому мы должны иметь возможность использовать его для зацикливания, пока не будет изменено каждое слово. Вот код

Эта часть должна быть в конфигурации вашего основного сервера, на корневом уровне или в <VirtualHost>:

RewriteEngine on
RewriteMap uc int:toupper

Тогда это в вашем .htaccess:

RewriteEngine on
RewriteRule (.*)(?:^|-|(/))([a-z])([a-z]*)(?![a-z])(.*?)(?:\.php)?$ $1$2${uc:$3}$4$5.php

Это должно сделать это. Пожалуйста, попробуйте и дайте мне знать результаты.

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

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

Обратите внимание, что вопрос был обновлен с момента написания этого ответа и изначально не указывал, что он не соответствует формату - этот ответ охватывает слово-слово / слово-слово

Эта часть должна быть в конфигурации вашего основного сервера, на корневом уровне или в <VirtualHost>:

RewriteEngine on
RewriteMap uc int:toupper

Тогда это в вашем .htaccess:

RewriteEngine on
RewriteRule ([a-z])([a-z]*)-([a-z])([a-z]*)/([a-z])([a-z]*)-([a-z])([a-z]*) %{uc:$1}$2%{uc:$3}$4/%{uc:$5}$6%{uc:$7}$8.php

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

Он будет перенаправлять отдельные буквы в любом из четырех положений слова. Предположим, что все имеют одинаковый формат, два слова, использующие от a до z, разделенные только одним дефисом.

Если у вас нет доступа к конфигурации основного сервера, я предлагаю вместо этого запустить скрипт для переименования ваших файлов, сделав имена по крайней мере строчными. Это невозможно без RewriteMap и это должно идти в основном конфиге.

Ref:

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