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

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

22.03.2019, 12:11. Показов 5194. Ответов 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
22.03.2019, 14:05
Поищите по запросу "единая точка входа". Так работает большинство современных сайтов.
1
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
23.03.2019, 21:12  [ТС]
Так, ребятки... что-то у меня ничего не работает. Пробовал сделать по разным инструкциям - всё безрезультатно.
Строку "LoadModule rewrite_module modules/mod_rewrite.so" в файле /etc/httpd/conf.modules.d/00-base.conf проверил - она раскомментирована.
Файл .htaccess имеет следующий вид:
Code
1
2
3
4
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
Лежит в корне сайта (рядом с index.php), а также скопирован ещё в десять разных мест на всякий случай.
При вводе URL несуществующей страницы сервер выдаёт 404, как и прежде.
Может у меня нет самого модуля mod_rewrite? Как это проверить?
0
1308 / 1000 / 232
Регистрация: 01.10.2018
Сообщений: 3,894
23.03.2019, 23:13
Лучший ответ Сообщение было отмечено ChildOfFlowers как решение

Решение

У вас виртуальный хостинг или сервер? Если первое, то mod_rewrite наверняка включен. Если второе, вы вообще уверены, что именно Apache активен? Используйте функцию phpinfo() в каком-нибудь php-файле - получите подробную информацию, включая список подключенных модулей.

Добавлено через 5 минут
Проверьте, есть ли реакция хоть на что-нибудь в .htaccess, например на ErrorDocument. Если нет, возможно, забыли включить AllowOverride. Лучше это сделать в конфигурационном файле конкретного виртуального хоста:
Code
1
2
3
4
5
6
7
8
9
10
<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
    <Directory /var/www/estic>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
Также можно прямо тут писать директивы mod_rewrite, не используя .htaccess (при этом синтаксис и порядок обработки правил будет отличаться), что вполне нормально, т.к. при использовании единой точки входа эти настройки меняются редко.

...При этом AllowOverride лучше отключить тут же явно: AllowOverride None.
1
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
24.03.2019, 09:53  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
возможно, забыли включить AllowOverride
Точно! Ни в одной инструкции, что я нашёл, не сочли нужным упомянуть про такую мелочь
0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
25.03.2019, 14:04  [ТС]
Я тут ещё один неприятный момент обнаружил. Мы же, когда надо в URL использовать зарезервированный символ не по назначению, записываем его в виде кода со знаком % в начале, чтобы сервер не обращал на него внимание. Так вот, если вставить в URL код слеша (%2f), происходит странное. Во-первых, mod_rewrite не перенаправляет этот запрос на общую страницу, хотя, вроде, по настройкам .htaccess должен перенаправлять все запросы без исключения. Во-вторых, сервер интерпретирует код в слеш, чего, казалось бы, делать не должен. В итоге опять получается ошибка 404. Я думаю это баг...
Может можно как-то допилить .htaccess чтобы обойти его?
0
1308 / 1000 / 232
Регистрация: 01.10.2018
Сообщений: 3,894
25.03.2019, 17:10
Да, есть такое исключение. Попробуйте указать AllowEncodedSlashes On или AllowEncodedSlashes NoDecode в контексте виртуального хоста.

Добавлено через 6 минут
В общем-то можно и так оставить, как в моем примере выше. Если кто-то делает подобные запросы, это уже вряд ли относится к обычным пользователям. Скорее всего что-то "прощупывают", а тут чем проще ответ, тем лучше.
1
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
26.03.2019, 12:43  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
Попробуйте указать AllowEncodedSlashes On
Помогло, спасибо.
Цитата Сообщение от estic Посмотреть сообщение
чем проще ответ, тем лучше
Согласен. Но страница 404 должна быть во всех случаях одинаковая. Даже с точки зрения безопасности, если не брать в расчёт банальную эстетику.
Такое ерундовое дело, а сколько тонкостей. У меня тут ещё вопросик возник... надеюсь последний
В моей конфигурации .htaccess прописаны правила перенаправления для файлов и для директорий, как я понял (читабильность у него, конечно, та ещё). Так вот, если в url вбить адрес существующей директории, то попадаем на страницу 403 Forbidden. Естественно, мне бы хотелось обрабатывать этот кейс в общем скрипте. Как это сделать?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
26.03.2019, 14:51
ChildOfFlowers,
читабильность у него, конечно, та ещё
Пришло время открыть для себя nginx, конфиги апача станут в страшном сне сниться после него.
*Так вот, если в url вбить адрес существующей директории, то попадаем на страницу 403 Forbidden. Естественно, мне бы хотелось обрабатывать этот кейс в общем скрипте. Как это сделать?
Убрать RewriteCond %{REQUEST_FILENAME} !-d
0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
26.03.2019, 15:25  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Убрать RewriteCond %{REQUEST_FILENAME} !-d
Да, я об этом тоже первым делом подумал. Только в мануале, по которому я этот конфиг писал, было написано, что это не просто так. Как я понял, это нужно для правильной привязки файлов, которые лежат на сервере (картинок, скриптов, и т.д.). Может я что-то не так понял?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
26.03.2019, 15:33
ChildOfFlowers,
нужно для правильной привязки файлов, которые лежат на сервере (картинок, скриптов, и т.д.).
Осталось понять что эти слова означают
0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
26.03.2019, 15:35  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Осталось понять что эти слова означают
С Хабра:
Но не следует забывать о том, что кроме обращения непосредственно к скрипту, браузер будет запрашивать у сервера различные файлы ресурсов, такие как каскадные таблицы стилей, изображения, файлы со скриптами и т.п. Для того, чтобы сервер дал доступ браузеру к желаемому, нужно задать дополнительные условия директиве RewriteRule. Эти условия описываются директивой RewriteCond, которая определят когда следует делать преобразования в URL или когда необходимо оставить его без изменений.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
26.03.2019, 15:40
ChildOfFlowers, и при чем тут вот эта строка RewriteCond %{REQUEST_FILENAME} !-d. Строка с -f действительно нужна, чтобы правило не применялись к существующим файлам.
0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
26.03.2019, 15:49  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
и при чем тут вот эта строка
Возможно, я что-то не так понял. Но если эта строка действительно не нужна, тогда у меня аналогичный вопрос. Зачем её написали в мануале?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
26.03.2019, 16:53
Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
Как я понял, это нужно для правильной привязки файлов, которые лежат на сервере
-f = файлы
-d = директории
0
1308 / 1000 / 232
Регистрация: 01.10.2018
Сообщений: 3,894
26.03.2019, 19:29
Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
Но страница 404 должна быть во всех случаях одинаковая.
Поэтому я и назвал это исключением. AllowEncodedSlashes имеет значение по умолчанию Off. Многие ничего тут не меняют или вовсе не знают об этой особенности. В результате получаем "стандартную" страницу 404 при появлении закодированных слешей в адресе даже при использовании единой точки входа. Но с вашим утверждением я в общем-то тоже могу согласиться.

Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
В моей конфигурации .htaccess прописаны правила перенаправления для файлов и для директорий, как я понял (читабильность у него, конечно, та ещё). Так вот, если в url вбить адрес существующей директории, то попадаем на страницу 403 Forbidden. Естественно, мне бы хотелось обрабатывать этот кейс в общем скрипте. Как это сделать?
А зачем вы указали условие RewriteCond %{REQUEST_FILENAME} !-d? Наверное, откуда-то скопировали. Многие добавляют это условие, совершенно не думая о последствиях. Вы стараетесь разобраться, что похвально Ошибка 403, кстати, может перехватываться и переводиться в 404. Но в данном случае можно избежать этого витиеватого пути, тем более что запросы с именами каталогов могут нести полезную нагрузку и не приводить к 404.

Тут есть один тонкий момент. Дело в том, что запросы с именами каталогов наподобие /dir могут приводить к автоматическому перенаправлению на /dir/, и если при этом вы пытаетесь делать обратное, то, мягко говоря, будет нехорошо Но это легко решается при помощи отключения модуля, выполняющего автоматическое перенаправление, или использования специальной директивы в рамках данного модуля.
0
 Аватар для korobas
0 / 0 / 0
Регистрация: 27.03.2019
Сообщений: 3
27.03.2019, 17:30
Классический пример записи в htaccess:

Code
1
2
3
4
5
6
7
8
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?url_param=$1 [L]
    AddDefaultCharset UTF-8
</IfModule>
0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
06.05.2019, 11:40  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
и при чем тут вот эта строка RewriteCond %{REQUEST_FILENAME} !-d
Цитата Сообщение от estic Посмотреть сообщение
А зачем вы указали условие RewriteCond %{REQUEST_FILENAME} !-d? Наверное, откуда-то скопировали.
Скопировал. Но, как выяснилось, в моём случае оно действительно оказалось нужно.
У меня такая структура: index.php, в зависимости от запроса, подгружает (include) модули из директории modules. Собственно после слеша в запросе и указывается имя модуля, соответствующее имени файла модуля.
Если удалить RewriteCond %{REQUEST_FILENAME} !-d, index.php не может загружать модули. А с этой строкой вылетает ошибка 403 при запросе mysite/modules. Кстати, и модуль с именем modules у меня действительно существует.
0
1308 / 1000 / 232
Регистрация: 01.10.2018
Сообщений: 3,894
06.05.2019, 13:53
Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
Если удалить RewriteCond %{REQUEST_FILENAME} !-d, index.php не может загружать модули.
Почему?

Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
Собственно после слеша в запросе и указывается имя модуля, соответствующее имени файла модуля.
После какого слеша? Т.е. /module или /modules/module?

Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
А с этой строкой вылетает ошибка 403 при запросе mysite/modules.
Это плохо или хорошо? Если таким искусственным способом вы пытаетесь защититься от прямого доступа к modules, это не очень удачная идея. Можно так (правило пропустит /modules, но что-то, подпадающее под /modules/.*, уже нет):
Code
1
RewriteRule ^modules/ - [NC,F]
Но лучше убрать этот каталог за пределы корневого каталога сайта.
0
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
06.05.2019, 14:17  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
Почему?
Это я и хотел бы узнать
Цитата Сообщение от estic Посмотреть сообщение
После какого слеша?
Чтобы отобразить модуль, я набираю mysite/module, и index.php загружает module из директории modules
Цитата Сообщение от estic Посмотреть сообщение
Это плохо или хорошо?
Это очень плохо. Проблема возникла когда имя директории (modules) совпало с именем модуля. Т.е., у меня есть модуль "modules", лежащий в директории "modules", и с ним то возникла эта проблема. Можно, конечно, директорию modules переименовать во что-нибудь невообразимое, чтобы её имя никогда не пересеклось ни с каким именем модуля. Но это, я считаю, костыль. Как и
Цитата Сообщение от estic Посмотреть сообщение
убрать этот каталог за пределы корневого каталога сайта
Потому что тогда уж надо все каталоги выносить за пределы корневого. Ведь имя любого каталога может пересечься с именем модуля.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.05.2019, 14:17
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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