Здравствуйте!
Помогите составить правило mod_rewrite для httpd.confДолжна обрабатываться форма по POST и по GET скриптом http://site.ru/cgi-bin/script.pl?param1¶m2 но с другим URL в action:
<form action="http://site.ru/news/param1/param2/" method="post">
<input typr="submit">
</form>Структура каталогов сервера:
ls -la site.ru/drwxr-xr-x logs
error_log
access_logdrwxr-xr-x docs
index.htmldrwxr-xr-x cgi-bin
script.plЗаранее благодарен!
ну хоть скажите "RTFM", а то 3 дня тишина...
>ну хоть скажите "RTFM", а то 3 дня тишина...RTFM )
Не забывай, в общем виде GET-урлы имеют вид
/?var1=val1&var2=val2&var3=val3...
у POST-ов урлы нормальные, без этого кавардака.
впрочем, если в script.pl форма парсится вручную, то на правильный формат можно забить болт с высокой колокольни.Задача mod_rewrite - переписывать url запроса. На этом можно организовать ЧПУ, например.
Это было бы понятно для обычных страниц на сайте, чтобы юзер в браузере видел что-то вроде site.com/news/latest или /news/2010/01/01 и не нервничал из-за обилия &, =, + и, возможно, A%20B%FD%A8%92..Но в данном случае, можно задуматься, а стоит ли городить ЧПУ для субмита форм. Если форма субмитит POST-ом, то юзер все равно увидит только site.com/script.pl. С GET-ом сложнее, но такова его природа. А mod_rewrite из GET-запроса сделать POST не сможет.
Если данная форма - это универсальная добавлялка контента (где сам контент POST-ится, а параметры, описывающие к чему этот контент относится указаны в виде ЧПУ в action формы), то про GET можно забыть.
И в итоге задача сводится к переводу урла /news/param1/param2 в get-вид к script.pl.
Можно, конечно, в форму накидать hidden-ов, в них указать все эти news, param* и не париться в mod_rewrite, а тупо POST-ить на script.pl, но если уж хочется побаловаться...В общем, составляем регулярку, которой последовательно превращаем /news... в /script.pl?... Но помни, ровно в полночь url превратится в ...)) Помни, что регулярка - это конечный автомат и если заранее неизвестно, сколько может быть param-ов в урле, то волшебства не получится (на всех может back-reference-ов не хватить, да и вообще все зависнет...). А если всегда столько же, по пофиг.
Надо что-то навроде #/(.+)/(.+)/(.+)#/script.pl?\1&\2&\3# (или как-то так, тут может надо будет обуздать жадность квантификаторов).
Это, ессно, не формат mod_rewrite (мне лень :) ) и вообще тут может быть написана полная туфта, сходная с тем, что я генерил, когда только открыл книжку по регуляркам. Но мне простительно, т.к. предыдущий рабочий день был тяжелым, я зае... устал, сейчас 4 утра и я еще не сплю :)))
Но, надеюсь, общее направление я указал. RTFM ;)
Можно perldoc perlre, можно книжку "Регулярные выражения", можно гугл.
Спасибо за ответ!>Это было бы понятно для обычных страниц на сайте, чтобы юзер в
>браузере видел что-то вроде site.com/news/latest или /news/2010/01/01 и не нервничал из-за
>обилия &, =, + и, возможно, A%20B%FD%A8%92..
>вообще я хочу это использовать, чтобы скрыть технологию, а именно cgi-bin/script.pl
>Спасибо за ответ!
>
>>Это было бы понятно для обычных страниц на сайте, чтобы юзер в
>>браузере видел что-то вроде site.com/news/latest или /news/2010/01/01 и не нервничал из-за
>>обилия &, =, + и, возможно, A%20B%FD%A8%92..
>>
>
>вообще я хочу это использовать, чтобы скрыть технологию, а именно cgi-bin/script.plТак сделайте action="http://site.com/post" method="POST" в форме,
а в .htaccess что-то типа
RewriteRule ^post$ /cgi-bin/script.pl [L,QSA]
насчет флагов - лень глядеть правильно ли, брал из похожего примера
Спасибо за ответ!>RewriteRule ^post$ /cgi-bin/script.pl [L,QSA]
Вот так не получается в том-то и дело, он ищет cgi-bin после DocumentRoot
DocumentRoot у меня /home/site.ru/docs
>Спасибо за ответ!
>
>>RewriteRule ^post$ /cgi-bin/script.pl [L,QSA]
>
>Вот так не получается в том-то и дело, он ищет cgi-bin после
>DocumentRoot
>DocumentRoot у меня /home/site.ru/docsПрямой вызов в браузере /cgi-bin/script.pl работает?
А ScriptAlias /cgi-bin/ "/full/path" задан?
А <Directory> для каталога cgi-bin?
Если RewriteRule не работает, почитайте про флаги ([L,QSA]), может эти вам не подходят.
Спасибо за ответ!>Прямой вызов в браузере /cgi-bin/script.pl работает?
работает
>А ScriptAlias /cgi-bin/ "/full/path" задан?
да, /home/site.ru/cgi-bin
>Если RewriteRule не работает, почитайте про флаги ([L,QSA]), может эти вам не
>подходят.rewrite срабатывает, но он пытается перекинуть на скрипт в каталоге /home/site.ru/docs/cgi-bin/script.pl вместо /home/site.ru/cgi-bin/script.pl
>rewrite срабатывает, но он пытается перекинуть на скрипт в каталоге /home/site.ru/docs/cgi-bin/script.pl вместо
>/home/site.ru/cgi-bin/script.plСмотрите и проверяйте настройки апача.
А cама форма, случаем не находится на странице site.ru/docs/bla-bla.html? Тогда action формы и свой RewriteRule в студию.
Еще читайте в доках апача про ScriptAliasMatch, может вам и его хватит.
>Еще читайте в доках апача про ScriptAliasMatch, может вам и его хватит.
>спасибо, разбираться некогда, а ScriptAliasMatch хватило ))