G'day,
Как сказано в заголовке, я пытаюсь сделать URL-адрес отформатированным как: /this/is/mah/page/strucutre
для файла this_is_mah_page_structure.php
.
Теперь у меня есть это работает - за исключением того, что я не могу знать глубины структуры. Таким образом, мне нужна рекурсия.
Рабочий снипит, который у меня есть для одной и двух замен:
# map the slashes to underscores
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/?$ $1_$2 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ $1_$2_$3 [L]
Я нашел это: Htaccess рекурсивно заменяет подчеркивания на дефисы , в которых указано, как это сделать (для разных символов); и это https://www.askapache.com/htaccess/rewrite-underscores-hyphens-seo-url/, которое показывает аналогичный код. Но я не могу заставить его работать.
Кроме того, я обнаружил, что рекурсия .htaccess может вызвать 500 ошибок - где-то порядка 10 циклов - на основе LimitInternalRecursion
. Исходя из этого, я попытался заменить несколько одним проходом, но это дало неожиданный результат - удвоение URL-адреса.
Это пример из другого ответа StackOverflow, чтобы дать вам представление о том, чем я был тестирование. Есть идеи / мысли / направление?
(Подчеркивание заменяется дефисом - так что это неправильная сторона, но это начало)
RewriteEngine On
# if there is only one underscore then repalce it by - and redirect
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=302]
# if there are more than one underscores then "repeatedly" repalce it by - and set env var USCORE
RewriteRule ^([^_]*)_([^_]*)_(.*) $1-$2-$3 [E=USCORE:1]
# if USCORE env var is set then redirect
RewriteCond %{ENV:REDIRECT_USCORE} =1
RewriteRule ^([^_]+)$ /$1 [L,R=302]
- Редактировать и полное решение -
Итак, в этом посте меня наконец осенило, что наличие / отсутствие R = 302 (или 301) - это то, что сдвигает идею с «Сопоставить URL-адрес с файлом» (ie: прозрачный ); в «Перенаправить». Это должно было быть очевидным, но я думал, что это было еще не все. правила и реальные файлы / каталоги с тем же именем. (т.е. скрипты. js, /images/yomomma.jpg, et c)
# when there are more than one / then "recursively" replace it by _
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+/.+)$ $1_$2 [N,DPI]
# when there is only one / then replace it by _ and redirect
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)$ /$1_$2 [NE,L]