Перенаправление данных формы

Discussion in 'PHP' started by Apeckou, 12 Jun 2012.

  1. Apeckou

    Apeckou Elder - Старейшина

    Joined:
    23 Jan 2007
    Messages:
    143
    Likes Received:
    11
    Reputations:
    0
    У меня возникла задача, которую я хз как решить.

    Есть сайт файлообменника.
    На главной странице main.php - форма загрузки файла.

    Сайт поддерживает несколько разных серверов. Нужно рандомно(или нет - не важно) перенаправлять форму с главной страницы файла на скрипт upload.php лежащий на этих серверах.

    На данный момент решил задачу по-варварски: методами PHP при генерации главной страницы просто вписываю в ACTION формы загрузки адрес нужного сервака.
    Но это хреново, т.к. любой чел, просмотревший код, может сделать такую форму у себя и грузить все по одной и той же ссылке (на один сервер).

    Хотелось бы сделать перенаправление на нужный скрипт методами ПХП на стороне сервера.


    Пример:

    Main.php отправляет данные формы на select.php

    в select.php происходит выбор сервера и header("Location: нужныйсервер/upload.php");

    upload.php на одном из серверов принимает форму.


    но естественно header("Location:..."); просто перенаправляет юзера на страницу, не передавая этой странице post-данные главной формы.

    Пробовал разные заголовки:
    header("HTTP/1.1 301 Moved Permanently");
    header("HTTP/1.1 303 See other");
    и тп. ничо не помогает.



    Если это невозможно, то объясните мне плиз, как на сайте imageshack.us это сделано. У них главная форма обращается ACTION="post.imageshack.us"
    а файл картинки впоследствии оказывается на img14.imageshack.us/блаблабла.jpg
     
  2. Fail_Ed

    Fail_Ed New Member

    Joined:
    9 Apr 2012
    Messages:
    23
    Likes Received:
    0
    Reputations:
    -5
    Я думаю, что они сначала загружают на один сервер, а потом передают его на другой.
     
  3. Apeckou

    Apeckou Elder - Старейшина

    Joined:
    23 Jan 2007
    Messages:
    143
    Likes Received:
    11
    Reputations:
    0
    это как минимум
    1. лишний трафик (двойной)
    2. лишнее время ожидания для юзера (двойное)

    не думаю что они стали бы так делать оО


    к тому же, судя по логам wireshark у меня при загрузке файла идет обмен TCP-трафиком с каким-то айпишником, который даже не пингуется. Вот это сомнения вызывает.
     
  4. Fail_Ed

    Fail_Ed New Member

    Joined:
    9 Apr 2012
    Messages:
    23
    Likes Received:
    0
    Reputations:
    -5
    Можно просто хранить на одном сервере, а давать ссылку-перенаправление.
     
  5. Apeckou

    Apeckou Elder - Старейшина

    Joined:
    23 Jan 2007
    Messages:
    143
    Likes Received:
    11
    Reputations:
    0

    и нахуя? =D
     
  6. Fail_Ed

    Fail_Ed New Member

    Joined:
    9 Apr 2012
    Messages:
    23
    Likes Received:
    0
    Reputations:
    -5
    Вполне логичный вопрос.
    Возможно, при заходе на страницу рандомно определяется сервер, куда будет загружен файл и открывается страница загрузки этого сервера через iframe.
     
  7. Apeckou

    Apeckou Elder - Старейшина

    Joined:
    23 Jan 2007
    Messages:
    143
    Likes Received:
    11
    Reputations:
    0
    то есть мы кагбе на основном сайте, видим УРЛ основного сайта, а во фрейме 100х100% открыта страница другого сервака?
    Идея интересная, но не катит)

    Ибо <form action="http://post.imageshack.us"> явно указан путь главного сервака, а не относительный путь скрипта)
     
  8. Dmit3Y

    Dmit3Y Member

    Joined:
    19 Jul 2010
    Messages:
    45
    Likes Received:
    8
    Reputations:
    0
    А почему-бы и не сделать? Тем более, если сервера стоят в одном ЦОДе, то там с временем ожидания проблем нету... (если сразу перенаправлять трафик на нужный сервер)

    А вообще заставил задуматься.. Это можно реализовать кучей различных способов...
     
  9. Fail_Ed

    Fail_Ed New Member

    Joined:
    9 Apr 2012
    Messages:
    23
    Likes Received:
    0
    Reputations:
    -5
    Я имел ввиду немного другое, но это не важно.
    Значит главный сервер закачивает файл на рандомный сервер.


    Dmit3Y, ага, по usb проводочкам файлы перекидывать :D :D
     
    #9 Fail_Ed, 12 Jun 2012
    Last edited: 12 Jun 2012
  10. Dmit3Y

    Dmit3Y Member

    Joined:
    19 Jul 2010
    Messages:
    45
    Likes Received:
    8
    Reputations:
    0
    А вообще есть у меня мысль:
    1) перед отправкой формы, на основном сервере генерируется ключ специальный (на основе данных сессии или еще чего-нибудь). Ключ добавляется в бд
    Скрипт возвращает адрес сервера и ключ.
    2) Во время загрузки клиент отправляет методом POST ключ и файл.
    Сервер принимает файл и удаляет ключ из базы.

    Немного бред..Но я бы делал так. + предусмотреть защиту, чтобы ключ нельзя было получить простой имитацией запроса к серверу...

    UPD: Возможно совсем не бред...
    http://vk.com/developers.php?oid=-1&p=photos.getUploadServer
    Как видите, здесь при получении адреса сервера, в адресе присутствует ключ и прочие параметры...
     
  11. Fail_Ed

    Fail_Ed New Member

    Joined:
    9 Apr 2012
    Messages:
    23
    Likes Received:
    0
    Reputations:
    -5
    Вполне возможно, вариантов много.
     
  12. VY_CMa

    VY_CMa Green member

    Joined:
    6 Jan 2012
    Messages:
    913
    Likes Received:
    480
    Reputations:
    724
    Кластеры рулят =) Все это дело у imageshack реализовано самим вэб сервом, подобно и у многих посещаемых порталов: facebook, vk, youtube. Копай в эту сторону, если есть желание ^_^
     
    _________________________
  13. Fail_Ed

    Fail_Ed New Member

    Joined:
    9 Apr 2012
    Messages:
    23
    Likes Received:
    0
    Reputations:
    -5
    Спасибо а наводку.
     
  14. Apeckou

    Apeckou Elder - Старейшина

    Joined:
    23 Jan 2007
    Messages:
    143
    Likes Received:
    11
    Reputations:
    0
    Кластеры рулят =)
    Копай в эту сторону

    Насколько я понимаю, при использовании кластеров нет явного разделения по серверам (img14.imageshack.us / img15.imageshack.us / ...)

    я в своем проекте буду использовать именно разные серверы (даже физически расположенные в разных странах).

    вот отсюда и задача как-то организовать загрузку файла С ОДНОЙ формы по РАЗНЫМ серверам, не указывая при этом явно в action формы на какой сервер идет загрузка.

    то есть идеально было бы так:

    #main.html
    <form action="select.php">
    <input type=file name=blabla>
    </form>

    #select.php
    <?php
    //выбор сервера из списка
    //пусть даже рандомно, не важно
    //перенаправление на скрипт upload.php лежащий на выбранном сервере
    ?>

    #upload.php
    <?php
    //загрузка файла и сохранение его на серв
    ?>


    можно конечно извратиться и, как было предложено, загружать данные сначала на основной сервер, а потом сокетами копировать файл на сервер-хранитель, но это опять же
    1. лишняя нагрузка на основной сервер (главный сервер вообще ниче не должен кроме сайта обрабатывать в идеале)
    2. лишнй расход трафика (2х)
    3. лишнее время ожидания юзером (2х)
     
  15. Dmit3Y

    Dmit3Y Member

    Joined:
    19 Jul 2010
    Messages:
    45
    Likes Received:
    8
    Reputations:
    0
    Как вариант подключить все хранилища к главному серверу (примонтировать c NFS или gvfs + ftp)
    напирмер:
    /home/user/storage/1
    /home/user/storage/2
    /home/user/storage/3
    /home/user/storage/4
    /home/user/storage/5

    При получении файла php скриптом, сохранять в одну из этих папок. Т.е. сохранять сразу на сервер.

    UPD:
    Тогда запрос нужно будет на стороне клиента сразу отправлять на нужный сервер. Я о способе реализации чуть выше писал. Если хочешь скрыто, то в любом случае будет задействован основной сервер.
     
    #15 Dmit3Y, 12 Jun 2012
    Last edited: 12 Jun 2012
  16. Apeckou

    Apeckou Elder - Старейшина

    Joined:
    23 Jan 2007
    Messages:
    143
    Likes Received:
    11
    Reputations:
    0
    пасиба, идея насчет примонтировать заинтереосвала

    наверное буду делать так же как и щас - варварски менять action
    во всяком случае depositfiles так делает и ничо, живет...
     
  17. Fail_Ed

    Fail_Ed New Member

    Joined:
    9 Apr 2012
    Messages:
    23
    Likes Received:
    0
    Reputations:
    -5
    Еще можно на каждом сервере хранить свой загрузчик.
    При доступе к сайту рандомно выбирается сервер и разворачивается iframe на все окно браузера.
    А там уже загружается через загрузчик определенного сервера.