Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090

Обработка разных URL на одной странице

22.03.2019, 12:11. Показов 5196. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеем запросы вида "сайт/страница". По дефолту веб сервер вернёт по такому запросу страницу, указанную после слеша, или выдаст ошибку 404, если соответствующей страницы не существует на сервере.
Мне надо, чтобы веб сервер не искал страницу из URL на сервере, а направлял все запросы на одну страницу, где они уже будут обрабатываться скриптом.
Как это можно сделать?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.03.2019, 12:11
Ответы с готовыми решениями:

Отобразить html-модуль, только на одной странице, соответствующей URL
Доброго всем дня! Нужно отобразить HTML-модуль, только на одной странице, соответствующей URL. Например:...

Две разных кодировки на одной странице
Есть сайт. на одной странице есть два вида кодировок. cp1251 и utf-8 . Пытаюсь запустить его локально. Поставил базу, скопировал сайт. И.....

Два разных кастомных checkbox на одной странице
Имеется вот такая реализация замены чекбокса картинками. label { width: 40px; height: 40px; display: block; ...

27
1308 / 1000 / 232
Регистрация: 01.10.2018
Сообщений: 3,894
06.05.2019, 15:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
Это я и хотел бы узнать
Вы ошибаетесь. Если убрать это условие, больше шансов, что запрос будет передан на обработку в index.php

Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
Потому что тогда уж надо все каталоги выносить за пределы корневого. Ведь имя любого каталога может пересечься с именем модуля.
Не все, а только с кодом. Каталоги со статичными файлами можно оставить в корневом каталоге. Так сервер будет их передавать быстрее, "не запуская PHP". Конечно, минимальный уровень защиты от конфликтов нужно обеспечить, но это не "костыль", а наоборот симбиоз: можно сделать так, чтобы "по адресам каталогов" обработку выполнял ваш скрипт, а "по адресам файлов" - непосредственно Web-сервер.

Добавлено через 6 минут
Например, по адресу /images может быть запущен модуль галереи для отображения графических файлов в указанном каталоге, а по адресам наподобие /images/image.jpg файлы будет отправлять непосредственно сервер. То же самое и при большей вложенности каталогов.
0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
06.05.2019, 16:07  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
Вы ошибаетесь
А вот и нет. Конечно же, первым делом я попробовал убрать это условие. Когда оно не прописано, не подключается вообще ни один модуль. Хотя не очень понятно почему так происходит... но, видимо, это правило влияет на разрешение адресов и между компонентами сайта.
Цитата Сообщение от estic Посмотреть сообщение
Каталоги со статичными файлами можно оставить в корневом каталоге
Так какая разница, какое содержимое каталога. Проблема возникает когда введённый url совпадает с адресом каталога. Т.е., гипотетически, эта проблема может возникнуть с любым каталогом, находящимся в корневой директории сайта.
Цитата Сообщение от estic Посмотреть сообщение
по адресам наподобие /images/image.jpg файлы будет отправлять непосредственно сервер
Это, кстати, мне тоже не подходит. Потому что мне наоборот надо защитить файлы на сервере от произвольного доступа к ним.
0
1308 / 1000 / 232
Регистрация: 01.10.2018
Сообщений: 3,894
06.05.2019, 17:24
Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
А вот и нет. Конечно же, первым делом я попробовал убрать это условие. Когда оно не прописано, не подключается вообще ни один модуль. Хотя не очень понятно почему так происходит..
Вот и ищите причину этой аномалии. По возможности помогу.

Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
Это, кстати, мне тоже не подходит. Потому что мне наоборот надо защитить файлы на сервере от произвольного доступа к ним.
Тогда, естественно, убираете и такие статичные файлы. Типичные примеры - лог-файлы, "сессионные" и т.п. Им явно не место в корневом каталоге сайта.
0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
06.05.2019, 21:45  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
Вот и ищите причину этой аномалии
Нашёл. Как всегда, ларчик просто открывался. У меня там была проверка на пустой $_SERVER['REDIRECT_URL']. Но я по первости, конечно, не мог знать, что при включённом RewriteRule $_SERVER['REDIRECT_URL'] не может быть пустым, а содержит, как минимум "/". Теперь то это кажется логичным, ведь RewriteRule и должно переводить все запросы на "/"... но кто ж знал
Ну да ладно, это я поправил. Но всплыл другой сюрприз. Если задать url, соответствующий адресу реального каталога, то в адресной строке браузера к запросу приписывается "?url_param=...". Т.е., в моём случае, когда я переходу по адресу "mysite/modules", теперь отображается нужная страница. Но при этом в адресной строке появляется "mysite/modules/?url_param=modules". Как эту напасть побороть, чтобы ничто не выдавало, что на сервере есть такая папка?
Ну и второе, о чём мы уже говорили. Если ввести полный путь к существующему файлу, этот файл отобразится. Почему на него не срабатывает RewriteRule? Ведь оно, по идее, должно срабатывать на все запросы без исключения?
0
1308 / 1000 / 232
Регистрация: 01.10.2018
Сообщений: 3,894
07.05.2019, 10:50
Непонятные параметры сами по себе не появляются Тут или какое-то постороннее правило повлияло, или вы в действительности используете не то правило для перенаправления запросов в index.php, которое показали. Внешнее перенаправление скорее всего было вызвано неявно из-за обращения к каталогу (обратите внимание на то, что к адресу помимо строки параметров был добавлен еще и завершающий слеш пути). Я об этом уже писал в теме: Обработка разных URL на одной странице (последний абзац). Речь о DirectorySlash со значением по умолчанию On. Измените значение на Off или отключите mod_dir.

Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
Ну и второе, о чём мы уже говорили. Если ввести полный путь к существующему файлу, этот файл отобразится. Почему на него не срабатывает RewriteRule? Ведь оно, по идее, должно срабатывать на все запросы без исключения?
У вас должно было остаться условие, касающееся файлов. Как защитить содержимое каталога, я уже писал. Специальное правило (или отдельный .htaccess "с запретами" в самом защищаемом каталоге и во всех вложенных, если нет наследования) или то, что вы назвали "костылем" и что в действительности является наилучшим способом защиты.
1
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
09.05.2019, 12:18  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
Речь о DirectorySlash со значением по умолчанию On. Измените значение на Off или отключите mod_dir.
Помогло, спасибо
Цитата Сообщение от estic Посмотреть сообщение
что в действительности является наилучшим способом защиты
Наверное вы правы. Хотя с точки зрения организации сайта мне кажется некорректно хранить контент за пределами корневого каталога. И всё-таки мне непонятно, почему правила из .htaccess не работают в этом случае.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
09.05.2019, 12:32
Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
некорректно хранить контент за пределами корневого каталога
Файлы сайта хранятся в папке, к примеру, site.ru/, а файлы, доступные пользователю, в site.ru/public/. Т.е. файлы index.php, style.css, js-скрипты и т.п. выносятся в папку public, а к исходной папке site.ru/ пользователь не имеет доступа через браузер.

Ваши скрипты хранятся в site.ru/app/, например site.ru/app/SomeScript.php

Для этого нужно изменить document root в вашем веб-сервере (apache/nginx/оба сразу).

Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
почему правила из .htaccess не работают в этом случае
Вот это правило:
Code
1
RewriteCond %{REQUEST_FILENAME} !-f
Отменяет редирект на index.php, если файл существует.
0
1308 / 1000 / 232
Регистрация: 01.10.2018
Сообщений: 3,894
10.05.2019, 09:48
Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
Хотя с точки зрения организации сайта мне кажется некорректно хранить контент за пределами корневого каталога.
Корневой каталог обычно не является основным каталогом сайта, как показал Jodah. Это всего лишь место для размещения общедоступных, часто только статичных, файлов. В высоконагруженных динамичных сайтах он часто бывает пустой, чтобы не тратить время даже на тест существования файла. Также часто в нем могут быть размещены только основные статичные файлы с предопределенными именами наподобие favicon.ico, robots.txt, кэша карты сайта. А все прочие статичные файлы загружаются с других хостов. Вы можете сконфигурировать Apache в контексте виртуального хоста так, чтобы вынести из корневого каталога и index.php (заодно можно запретить выполнение скриптов в пределах всего корневого каталога). Например (условие перед правилом усложнено, потому что в данном контексте %{REQUEST_FILENAME} еще не содержит полный путь в файловой системе):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
<VirtualHost *:80>
    ServerName estic.ru
    DocumentRoot /var/www/estic/public
    ErrorLog ${APACHE_LOG_DIR}/estic-error.log
    CustomLog ${APACHE_LOG_DIR}/estic-access.log combined
    RewriteEngine On
    RewriteCond /var/www/estic/public%{REQUEST_URI} !-f
    RewriteRule ^.* /var/www/estic/index.php
    <Directory /var/www/estic>
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>
В результате получится примерно такая структура основного каталога:
logs
modules
public
index.php

Файл index.php можно разместить и в соседнем с корневым каталоге, но лично я часто размещаю все точки входа (index.php, cron.php и т.п.) прямо в основном каталоге.

Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
И всё-таки мне непонятно, почему правила из .htaccess не работают в этом случае.
Тоже уже ответили. Только это называется не правилом, как его назвал Jodah, а условием. Это не самостоятельная директива, а приставка перед директивой правила. Я же вам советовал убрать условие, касающееся каталогов (с "!-d"). А условие, касающееся файлов (с "!-f"), должно было остаться. Это и есть тот самый тест на существование файла, который я уже упоминал в этом сообщении. Это условие и препятствует перенаправлению запросов в index.php, когда присутствует запрашиваемый файл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.05.2019, 09:48
Помогаю со студенческими работами здесь

продвижение двух разных запросов на одной странице
Здравствуйте! Можно ли на (главной странице) продвигать два запроса, которые не имеют общих слов, или они будут...

Как сделать на одной странице ссылки разных цветов?
Т.е. например сверху страницы ссылки синие, снизу - красные и т.п.

Обработка двух форм на одной странице
Здравствуйте, форумчане! На странице две формы, заполняю первую, данные уходят ajax’ом, в ответ приходит id новой записи ajax’ом, это id ...

Несколько однообразный форм на одной странице. Обработка
Опять буду надоедать людям)) Есть список чего-то. Пусть будет книг, например. Этот список выводится из модели Book. Для каждого поля...

Как настроить отправку двух разных форм обратной связи на одной странице?
Всем привет! Есть две формы обратной связи в модальном окне на одной странице, &quot;оставить заявку&quot; и &quot;заказать...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru