.htaccess - Рекурсивное преобразование слэшей в символы подчеркивания. - PullRequest
2 голосов
/ 05 мая 2020

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]

1 Ответ

2 голосов
/ 06 мая 2020

Я опубликовал этот ответ около 5 лет go, хотя теперь думаю, что его можно улучшить.

Вы можете использовать эти правила на сайте root .htaccess:

RewriteEngine On

# if request is for a file [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
# if request is for a directory
RewriteCond %{REQUEST_FILENAME} -d
# then ignore all rules below
RewriteRule ^ - [L]

# when there are more than one / then "recursively" replace it by _
RewriteRule ^([^/]+)/([^/]+/.+)$ $1_$2 [N,DPI]

# when there is only one / then replace it by _ and redirect
RewriteRule ^([^/]+)/([^/]+)$ /$1_$2 [NE,L,R=301]

Измените последнее правило на RewriteRule ^([^/]+)/([^/]+)$ /$1_$2 [L], если вы не хотите внешнего перенаправления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...