Использование правил перезаписи .htaccess для отражения «поддельной» структуры каталогов в панели адресов - PullRequest
1 голос
/ 01 ноября 2011

Я работаю с онлайн-энциклопедией и пытаюсь добиться следующего: Учитывая физическое местоположение файла в http://example.com/articles/c/a/t/Cat.html, Получить местоположение в адресной строке, чтобы показать http://example.com/encyclopedia/Cat.html

Это также должно работать, чтобы, если щелкнуть ссылку или кто-то набрал "example.com/encyclopedia/Cat.html" , сервер будет искать файл в "/ article / c / a / t / Cat.html ", но все же служит для более короткого URI в адресной строке.

Я понимаю, что для этого может потребоваться какой-то тяжелый .htaccess voodoo, или, возможно, для этой цели было бы лучше использовать PHP-скрипт.

Пока что в моем .htaccess есть следующее:

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^encyclopedia/(.*)\.html$ articles/$1.html [NC]
RewriteCond %{THE_REQUEST} ^GET\ articles/(.*)
RewriteRule ^articles/(.*) /encyclopedia/$1 [L,R=301]
</IfModule>

Однако, с этим кодом, он работает только, перейдя по адресу "example.com/encyclopedia/c/a/t/Cat.html" и показывая правильную страницу, и когда вы переходите к "/ Articles / C / A / T / Cat.html он по-прежнему не переписывает его как " / энциклопедия / ", он просто остается прежним.

Редактировать - удалив часть GET\ из RewriteCond и удалив косую черту в начале строки /encyclopedia/$1 в следующей строке, любые запросы к "/ article / c /a/t/Cat.html" правильно перенаправлены в "/ encyclopedia / c / a / t / Cat.html" . Я все еще в растерянности, пытаясь удалить часть "/ c / a / t", хотя. **

Я пытался использовать следующие два правила для удаления части "c / a / t /":

RewriteRule ^encyclopedia/((.)(.)(.).*)\.html$ articles/$2/$3/$4/$1.html [NC]
RewriteRule ^articles/(.)/(.)/(.)/(.*) /encyclopedia/$4 [L,R=301]

Но безуспешно, так как я уверен, что происходит то, что я получаю заглавную букву "C" из "Cat.html" и помещаю ее как "/ article / C / a / t / Cat. html ", который явно не будет работать.

Я искал и изучал .htaccess RewriteRule и RewriteCond в течение нескольких дней, но до сих пор не смог понять это и был достаточно ВЗГЛЯД, чтобы вызвать несколько мигреней.

Будет ли это лучше сделать с помощью сценария PHP? Или это вуду может быть достаточно легко выполнено только с помощью правил .htaccess?

1 Ответ

0 голосов
/ 01 ноября 2011

Во-первых, забудьте о .htaccess файлах. .htaccess files - это просто расширение файлов конфигурации Apache, которое вы можете поместить в некоторые каталоги. Они действительно замедляют работу вашего сервера Apache, ему нужно проверить часть своей конфигурации во время выполнения. Это сделано для того, чтобы разрешить некоторую настройку в размещенных средах.

Поместите все, что у вас есть, в .htaccess файлы в <Directory> разделах вашего VirtualHost и используйте AllowOverride None, чтобы сказать Apache, что нужно забыть о попытке прочитать .htaccess файлы.

Так что вам нужно это mod-rewrite вуду, а не .htaccess вуду: -)

Теперь ваша проблема переписывания довольно сложна. Если вам нужна помощь в переписывании модов, не забудьте прочитать эту статью о ServFault: Все, что вы хотели знать о правилах Mod_Rewrite, но боялись спросить?

Я предполагаю, что ваш Cat.html -> c/a/t/Cat.html является лишь примером, и вы можете иметь более 3 букв: CatAndDogs.html -> c/a/t/a/n/d/d/o/g/s/CatAndDogs.html.

Часть мод-рекрита, которая вам нужна (я думаю) RewriteMap . Там вы найдете несколько помощников, таких как lowercase:, которые могут помочь вам, но вы также найдете prg:, что означает использование внешней программы для выполнения сопоставления. Я хотел бы использовать Perl примеры таких примеров rewriteMaps, доступных через Google, и сделать некоторые преобразования. Должно быть довольно просто и быстро в Perl преобразовать CatAndDogs.html в c/a/t/a/n/d/d/o/g/s/CatAndDogs.html.

Обратите внимание, что RewriteMap никогда не будет работать внутри .htaccess. Забудьте .htaccess файлов. Ключевое слово prg: запустит вашу Perl-программу как параллельный демон и предоставит ему довольно много данных, вы действительно должны написать что-то надежное и быстрое. Не забудьте использовать директиву RewriteLock , чтобы избежать смешивания результатов (некоторые преобразователи prg: не заботятся о смешивании результатов, подумайте о балансировщике нагрузки для примеров, но вы хотите избежать смешивания результатов для параллельных запросов)

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