htaccess переписать имя подкаталога в строку запроса - PullRequest
4 голосов
/ 26 января 2011

У меня есть определенные потребности для определенного каталога моего сайта. Мне нужно изменить

/thisDirectory/subDirectory

чтобы пройти как

/thisDirectory?param=subDirectory

У меня проблемы с созданием файла htaccess, который это сделает. Я пробовал НЕСКОЛЬКО разных вещей, но я думаю, что это ближе всего:

RewriteEngine On
RewriteRule ^/directory/(.*)\??(.*)$ /directory/?page=$1&$2

Я сталкивался со всеми 500 ошибками сервера, бесконечными циклами перенаправления и т. Д. И т. Д. Любая помощь будет высоко оценена, спасибо!

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Я удивлен, что это работает вообще в контексте для каталога, так как вам нужно было бы удалить префикс пути для каталога из шаблона:

При использовании механизма перезаписи в файлах .htaccess префикс для каждого каталога (который всегда одинаков для определенного каталога) автоматически удаляется для RewriteRule сопоставления с шаблоном и автоматически добавляется после любой относительной (не начиная с косой черты или имени протокола) замены встречается конец набора правил.

В случае корневого каталога документа это будет ведущее /, и правило будет выглядеть так:

RewriteRule ^directory/(.*)\??(.*)$ /directory/?page=$1&$2

Но кроме этого, RewriteRule может проверять только путь URI, но не запрос; вам нужно RewriteCond, чтобы сделать это. Итак, попробуйте это:

RewriteRule ^directory/(.+)$ /directory/?page=$1 [QSA]

Здесь .+ вместо .* должно избегать бесконечной рекурсии, поскольку .* соответствует всему, даже пустой строке (это было бы в случае пустого сегмента пути после /directory/). А флаг QSA автоматически добавляет запрошенный запрос URI к новому.

1 голос
/ 27 января 2011

После большого разочарования ... Я думаю, что проблема была в том, чтобы попытаться переписать в тот же "каталог" (хотя я думал, что [L] позаботится о том, чтобы он не зацикливался ... но это, похоже, небыть так).Я изменил имя каталога, в который он переписывался, и он, кажется, работает ...

RewriteBase /my/base/rewrite/
RewriteRule ^directory/(.*)$ newDirectory/?page=$1 [L]
...