Перепишите дефисированный 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: