Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
12 / 12 / 2
Регистрация: 22.01.2014
Сообщений: 71
1

Как работает url такого типа index.php/reg/index

15.05.2015, 00:45. Показов 2029. Ответов 18
Метки нет (Все метки)

Мне интересно как это работает. И в каких случаях это пригодится. Встречал такой url в cms. Я попробовал у себя получилось так, что страница загрузился полностью, кроме подключаемых файлов таких как стили и javascript. Но находивший в этом каталоге файл не выполнил php код (скорее всего). И как понял не важно есть ли такой каталог или нет. Все равно выполнится код в файле index.php.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2015, 00:45
Ответы с готовыми решениями:

Как сделать одинаковое отображене нужного мне контента в index.php и index.html ?
Здравствуйте ! Подскажите пожалуйста .И извините за глупый вопрос.К php редко обращаюсь. Опишу...

Warning: Cannot modify header information - headers already sent by (output started at M:\home\reg.com\www\index.php:1)
Здравствуйте, помогите мне пожалуйста. Я только начал изучать PHP, и вроде бы у меня всё...

Как переименовать index.php в general? Повлияет ли это на переменные после '?' в url строке?
Доброго времени суток. Вопрос избитый, простите. Как переименовать index.php в general? Или...

Вывод файлов из директории с параметром типа index.php?id=number
Здравствуйте! А вы не подскажете как сделать так: имеется директория и в ней набор файлов. Хотел...

18
775 / 444 / 93
Регистрация: 24.10.2012
Сообщений: 3,240
Записей в блоге: 5
15.05.2015, 08:32 2
Просто используется mod_rewrite

http://www.seoschool.ru/search... guide.html
1
1931 / 1522 / 703
Регистрация: 17.11.2012
Сообщений: 6,574
15.05.2015, 13:25 3
Цитата Сообщение от tolimadokara Посмотреть сообщение
Просто используется mod_rewrite
или mod_rewrite(для перенаправления в точку входа) + роутер(разбор uri и запуск нужных скриптов)
0
12 / 12 / 2
Регистрация: 22.01.2014
Сообщений: 71
19.05.2015, 09:13  [ТС] 4
mod_rewrite только перенаправляет или может подгрузить страницу в другой странице?
Например как указанно выше у меня там index.php . Почему так я думаю, дело в том, что файл который к примеру находится физически по адресу к примеру /file/viedo.mp4 то при ссылке такого вида браузер понимает и вомпринимает как видео файл.
HTML5
1
2
3
<video tabindex="0" controls="" preload="none">
                        <source src="https://mysite.ru/index.php/s/rq1ae1nCJV6lBAd/download" type="video/mp4" />
                    </video>
Надеюсь, что сможете объяснить как это работает.
0
4 / 4 / 3
Регистрация: 21.09.2011
Сообщений: 41
19.05.2015, 10:52 5
Вот тут погляди Как убрать .php?
0
12 / 12 / 2
Регистрация: 22.01.2014
Сообщений: 71
19.05.2015, 13:45  [ТС] 6
Цитата Сообщение от Dorbah Посмотреть сообщение
Вот тут погляди Как убрать .php?
Спасибо, но видимо не совсем вы правильно поняли. Мне интересно как понимает браузер ссылку такого типо https://mysite.ru/index.php/s/... d/download от нормальной ссылки https://mysite.ru/video.mp4. И как это осуществить. Как правильно написать в .htaccess? Так же я думаю, что тут скорее всего без базы данных тоже ни как, но как все это взаимодействует вместе мне очень интересно.
0
Заблокирован
19.05.2015, 14:02 7
А зачем браузеру ее понимать? Ему важны прежде всего якори. Ссылка с index.php смотрится не очень красиво. Скорее всего это результат неправильной настройки CMS. Вам же fanatikus сказал, в чем тут суть. Да, роутер обычно работает с использованием базы данных, но не обязательно.
0
12 / 12 / 2
Регистрация: 22.01.2014
Сообщений: 71
19.05.2015, 18:48  [ТС] 8
Цитата Сообщение от Июнь Посмотреть сообщение
А зачем браузеру ее понимать? Ему важны прежде всего якори.
Аааа да, что такое все запутали меня. Кто ни будь может объяснить как создавать ссылку типо вот такого https://mysite.ru/index.php/s/... d/download которая эквивалентно https://mysite.ru/video.mp4. Не важно с php без php мне все равно. Мне интересно про вот такие "s/rq1ae1nCJV6lBAd/download" не понятные ссылки, а еще точнее "rq1ae1nCJV6lBAd", как браузеру объяснить, что вот это ссылка "https://mysite.ru/index.php/s/rq1ae1nCJV6lBAd/download" равно "https://mysite.ru/video1.mp4". То есть именно это ссылка откроет это видео, а другая к примеру https://mysite.ru/index.php/s/... d/download равен https://mysite.ru/video2.mp4.
Запрос вида http://site.net/shop/50/ будет рассматриваться сервером как http://site.net/index.php?dir=shop&s=50 я это понял как делать, но не понимаю как можно осуществить то что я написал выше. Чую что, это связно с база данных и тем же mod_rewrite, но как не догадываюсь.
Предположим в базе данных есть таблица которая хранит 3 строки это id, file, cash.
Мне просто не ясно как написать, что бы apache понял, что я имею виду. Если я напишу к примеру:
RewriteRule ^s/([A-Za-z-0-9]+)/download$ download.php?s=$1
То генерируемый html код
HTML5
1
<video src="https://mysite.ru/s/rq1ae1nCJV6lBAd/download"
будет восприниматься, как видео а не как ссылку и начнет воспроизводить видео. А при нажати на ссылку
HTML5
1
<a href="https://mysite.ru/s/rq1ae1nCJV6lBAd/download">скачать</a>
Он скачает файл. Не давно когда все это писал у меня возник еще мысль насчет ajax мне кажется, что тут и ajax участвует. Но точно не знаю у кого есть идеи я буду рад.
0
Заблокирован
19.05.2015, 22:29 9
Есть два основных способа:
1) по произвольной ссылке скрипт передает частями или полностью связанный с этой ссылкой файл, снабдив передаваемые данные указанием на тип содержимого. Для больших файлов PHP тут плохо подходит.
2) по произвольной ссылке скрипт делает перенаправление на актуальное местоположение файла.
0
666 / 637 / 335
Регистрация: 26.04.2014
Сообщений: 2,114
19.05.2015, 22:48 10
Используйте переменную $_SERVER['PATH_INFO'] для определения что находится после слеша (/).
index.php/reg
index.php/log
index.php/blabla
PHP
1
2
3
4
5
6
7
8
9
10
11
switch (str_replace('/', '', $_SERVER['PATH_INFO'])) {
case "reg":
$msg="registration";
break;
case "log":
$msg="login";
break;
default:
$msg="no";
}
echo($msg);
1
12 / 12 / 2
Регистрация: 22.01.2014
Сообщений: 71
20.05.2015, 00:30  [ТС] 11
Цитата Сообщение от Июнь Посмотреть сообщение
1) по произвольной ссылке скрипт передает частями или полностью связанный с этой ссылкой файл, снабдив передаваемые данные указанием на тип содержимого.
Что ты имеешь виду? Каким образом передает? Под типом содержимого ты имеешь виду mp4?
0
Заблокирован
20.05.2015, 01:32 12
В ответ на обращение по "произвольной" ссылке читает и выводит связанный с ней файл, предварительно сообщив тип содержимого:
Код
Content-Type: video/mp4
Читайте описание протокола. Там все написано
0
597 / 464 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
20.05.2015, 02:11 13
Цитата Сообщение от alexsamos33 Посмотреть сообщение
Используйте переменную $_SERVER['PATH_INFO']
не рекомендую использовать переменную $_SERVER['PATH_INFO']. Эта переменная устанавливается сервером, и не всегда будет установлена. Например, в умолчальной конфигурации nginx-а ее нет. Используйте, например, $_SERVER['REQUEST_URI'], потому что она будет установлена всегда. Она берется непосредственно из http-запроса и необходима для работы самого интерпретатора php (да, именно поэтому она вегда установлена).
hrach333, ответ на ваш вопрос по сути мало чем связан с mod_rewrite, особенно если вам достаточно ссылок вида https://example.com/index.php/.../download, вернее, если в конфигурации php стоит fix_pathinfo=1, или не указан вообще (он по умолчанию равен 1), потому что запрос будет и так и так перенаправлен в файл index.php.
Вообщем, решение вашей задачи можно разделить на несколько простых шагов.
Во-первых, вам нужно как-то на сервере сгенерировать имя ресурса, к которому следует обратиться пользователю для получения файла. Делается это средстами приложения (в вашем случае, php). Например, генерируете рандомом строку, прибавляете к ней слева 'http://example.com/index.php/s/', а справа '/download', ну или как вы хотите, чтобы выглядела ваша ссылка -- это уж ваше дело. Эту ссылку вы отдаете клиенту (например, в теге a, или можно даже в video, если у вас конкретно видео-файл, и вы хотите, чтобы он проигрывался в плеере, например)
2. Эту строку-рандом вам нужно как-то где-то сохранить на сервере, чтобы не забыть: вам потом нужно будет определять что именно по этой ссылке нужно отдавать некий ресурс, который ожидает пользователь. Поэтому либо эту строку-рандом или же полный путь (как вам будет удобнее потом это хранить/обрабатывать -- так и делайте) вам нужно записать либо в какой-то файл, либо в базу, либо еще куда-то (memcached, запихать на удаленный сервер, расшарить через shmem и сохранить в другом процессе -- как угодно, вариантов миллион).

Не по теме:

С пп 1-2, я так понимаю, проблем у вас нет, но нужно было это отметить


3. В файле index.php, или в одном из файлов, подключаемых из него, вам нужно проверять, не совпадает ли $_SERVER['REQUEST_URI'] (то есть имя запрошенного ресурса) с вашим шаблоном.

Не по теме:

Попробуйте для начала вывести где-нибудь этот $_SERVER['REQUEST_URI'], чтобы уточнить этот шаблон. Как правило, там будет часть uri запрошенного ресурса без указания домена и схемы, то есть что-то типа /index.php/s/<MY_RANDOM_STRING>/download

Как проверять на соответствие шаблону? Есть множество разных способов. Один из самых простых (однако, в некоторых случаях, не самый производительный):
PHP
1
2
3
4
if (preg_match('~/index.php/s/([\w+])/download~', $_SERVER['REQUEST_URI'], $matches[1])) {
  // обработка, в строке $matches[1] содержится та самая <MY_RANDOM_STRING>
  exit();
}
Таким образом, когда пользователь обратится по ссылке вида 'http://example.com/index.php/s/<MY_RANDOM_STRING>/download', он попадет в блок этой самой обработки.
4. Теперь вам нужно в блоке этой обработки отдать файл пользователю. Для разных веб-серверов это может выполняться по-разному, но во многих из них заложена возможность "перепрограммирования" логики отдачи статики (для апача сказать не могу, потому что не пользуюсь им, но для nginx, например, есть специальный заголовок X-Accel-Redirect). Есть также и способ передачи файла на уровне приложения. Ведь пхп умеет читать файлы! Берете простой цикл с fopen/fwrite/fclose, ставите посередине echo, и вообщем-то все готово. Однако, поскольку вы решили сами взять на себя функции веб-сервера, придется немного почитать rfc2616, дабы установить заголовки Content-Type, Content-Disposition и Content-Length, а также, если вам нужна возможность частичной отдачи файлов (известная технология, которую раньше применяли чуть менее чем все менеджеры закачек), то также рекомендую ознакомиться с заголовком Range и кодами ответа 206 и 415.
Последнее, правда делают крайне редко, потому что в пхп есть функция readfile, и практически все забывают о третьем параметре, либо ленятся, либо просто не задумываются, что файл могут запросить не с начала, а откуда-нибудь с серидины. В некоторых случаях (при организации файлообменников, например) эту возможность отключают/не реализуют специально. Впрочем, в любом случае, обработка Range в соответствии со стандартом довольно сложна, причем из-за этого в том же апаче довольно долго существовала небезызвестная уязвимость CVE-2011-3192. Примеры реализации отдачи файла с помощью readfile можно почитать в комментариях к документации об этой функции, на которую я дал ссылку чуть выше.
Таким образом, есть два подхода: с использованием веб-сервера или на уровне приложения.
Недостатком первого способа является привязка к конкретному веб-серверу, однако взамен вы получаете более высокую скорость отдачи файлов, особенно если предполагается, что у вас довольно много клиентов будет качать этот файл одновременно. Именно из-за этого этот способ эффективнее использовать в продакшене.
При реализации второго способа вам вручную придется реализовывать часть http-стека, и вы можете о чем-то подзабыть, вручную реализовывать сжатие (если нужно), обработку mime-типов и прочую хрень. Зато все будет работать независимо от веб-сервера, который вы используете. Также, стоит учесть, что сам пхп интерпретатор будет постоянно висеть в памяти, пока читается файл, что довольно накладно (и бесполезно) по расходам на оперативную память.

Не по теме:

Правда, говорят, что если последним в файле стоял вызов функции readfile, то на некоторых платформах при некоторых настройках управление полностью передается операционке, и сам интерпретатор выгружается из памяти, но я достоверно не могу на своем опыте не подтвердить ни опровергнуть эту инфу



5. Есть дополнительные моменты, например, если у вас сброшен fix_pathinfo, или вам нужны ссылки вида '/some/path/<MY_RANDOM_STRING>/download', то есть когда 'index.php' не стоит вначале. Соответственно, до выполнения шага 3, вам необходимо как-то передать управление тому скрипту, который будет управлять ссылками такого вида (это может быть как index.php, так и просто отдельный скрипт). Вот как раз это и достигается за счет mod_rewrite, или с помощью конфигурации веб-сервера (на том же nginx, который, как наверняка уже внимательный читатель догадался, я люблю больше, это делается с помощью location-ов)

Добавлено через 5 минут
Цитата Сообщение от Июнь Посмотреть сообщение
Читайте описание протокола.
s/описание протокола/стандарт mime ч.2/
2
Заблокирован
20.05.2015, 02:32 14
Цитата Сообщение от NEbO Посмотреть сообщение
не рекомендую использовать переменную $_SERVER['PATH_INFO']. Эта переменная устанавливается сервером, и не всегда будет установлена. Например, в умолчальной конфигурации nginx-а ее нет. Используйте, например, $_SERVER['REQUEST_URI'], потому что она будет установлена всегда. Она берется непосредственно из http-запроса и необходима для работы самого интерпретатора php (да, именно поэтому она вегда установлена).
Тоже хотела это написать.
0
12 / 12 / 2
Регистрация: 22.01.2014
Сообщений: 71
20.05.2015, 11:53  [ТС] 15
Ладно я подумаю в любом случае спасибоNEbO.
0
1939 / 1763 / 825
Регистрация: 23.01.2014
Сообщений: 6,210
22.05.2015, 10:47 16
Цитата Сообщение от hrach333 Посмотреть сообщение
pav1uxa, Где вы были? Вы можете таким образом объяснить мне в теме. Как работает url такого типа index.php/reg/index. Так как там только 1 ответ что-то объясняет, но еще не совсем понятно. А тут с кодом все четко написано (как раз для новичка). Буду очень благодарен.
Просто в Вашем случае одним кодом не отделаешься. Чтобы получить url такого вида, нужно для начала настроить mod_rewrite. Порядок настройки может немного различаться у разных серверов. Погуглить можно "ЧПУ" (человеку понятный урл - так называются url вида site.com/reg/index). В данном случае любой запрос к вашему сайту перенаправляется на index.php, например. А из строки $_SERVER['REQUEST_URI'] вы берете нужную информацию и выводите контент в соответствии с этой информацией.

И уже втором момент это "отдача" файла при таком url. Схема похожая как в той теме, в которой вы мне написали:
PHP
1
2
3
4
5
6
7
8
<?php
// если хотим "отдать для загрузки" файл programm.exe
// который находится в одной папке со скриптом
$file = "programm.exe";
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"" . basename($file) . "\""); 
readfile($file);
1
12 / 12 / 2
Регистрация: 22.01.2014
Сообщений: 71
23.05.2015, 17:33  [ТС] 17
Спасибо за ответ я побробую.
0
597 / 464 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
24.05.2015, 10:07 18
pav1uxa, про Content-Length забыли. Хотя, конечно, многие клиенты поймут, но с ним прогресс сможет отображаться. Также, не всегда Content-Type === 'application/octet-stream', если, например, это пдф-файл, или видео, я лично (и, думаю, что не только я) предпочитаю их сразу в браузере посмотреть, а дальше уже нажать Ctrl+S если понадобится. Поэтому крайне не люблю, когда меня заставляют его именно качать и сохранять на диск -- это лишние телодвижения.
Ну а про Range я уже говорил.
0
1939 / 1763 / 825
Регистрация: 23.01.2014
Сообщений: 6,210
24.05.2015, 13:23 19
Цитата Сообщение от NEbO Посмотреть сообщение
про Content-Length забыли. Хотя, конечно, многие клиенты поймут, но с ним прогресс сможет отображаться. Также, не всегда Content-Type === 'application/octet-stream', если, например, это пдф-файл, или видео, я лично (и, думаю, что не только я) предпочитаю их сразу в браузере посмотреть, а дальше уже нажать Ctrl+S если понадобится. Поэтому крайне не люблю, когда меня заставляют его именно качать и сохранять на диск -- это лишние телодвижения.
Ну а про Range я уже говорил.

Не по теме:

Я ничего не забывал... И все вышеуказанное отлично понимаю....

С тем же успехом можно сюда описание всего HTTP-протокола выложить на 100500 страниц. Я лишь пример указал, который "отдает файл" на скачивание (как я, впрочем, и указал).

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2015, 13:23

Не работает index.php в IIS
Всем доброго дня. Суть задачи установить rouncube используя сервер IIS. Столкнулся с следующей...

Почему в винде не работает header('Location: index.php'); ?
Почему в винде не работает header('Location: index.php'); ?

Денвера не работает ссылка localhost/Tests/phpnotice/index.php
Здравствуйте, после установки Денвера и переходе по ссылке проверочной страницы...

Не работает код, на открытие в ifraim выбранного из выподающего списка index.php
Всем доброго времени суток... Чуть ниже представлен код. Можете сказать в чем проблема, ибо он у...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru