LINUX.ORG.RU

Правильный роутер

 , ,


1

1
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php

1) Как правильно перенаправить все запросы на роутер, но тем не менее исключить перенаправление для стилей, js-скриптов, картинок, музыки, видео и прочего

2) Пробовал в регулярках поставить ^ и (css|js), не помогло, возможно я чего-то не понимаю

3) Почему на разных сайтах встречаются разные ключи, то [L], то [NC], в связи с этим ещё вопрос, написал правила для того чтобы защитить картинки от вставки на другие сайты, указал ключ [L], следующими строками идёт код который написал выше, будет ли он действовать после этого ключа, не очень понимаю как этот ключ работает (документацию читал, на разных сайтах искал ответ, но не понял дальше того что написано)

4) Опять же на некоторых сайтах рекомендуют схему index.php?param1=value1&param2=value2, как я понимаю получается GET-запрос, хотелось бы узнать мнения по этому поводу, удобно ли потом его разбирать, стоит ли этим направлением идти, как-то некрасиво выглядит и вроде если понадобится query_string, а знак вопроса уже занят, или они могут вместе быть?

5) Сходу ситуация, например нужно показать отчёт, на основе query_string скрипт получает год и выводит отчёт за этот год. Или есть более правильный способ?

1) Как правильно перенаправить все запросы на роутер, но тем не менее исключить перенаправление для стилей, js-скриптов, картинок, музыки, видео и прочего

Приведённый тобой пример их уже исключает.

3) Почему на разных сайтах встречаются разные ключи, то [L], то [NC]

Потому что разные ключи выполняют разные действия // К.О.

документацию читал

Плохо читал, там всё понятно даже если читать одну лишь расшифровку: http://httpd.apache.org/docs/current/rewrite/flags.html

4) Опять же на некоторых сайтах рекомендуют схему index.php?param1=value1&param2=value2, как я понимаю получается GET-запрос, хотелось бы узнать мнения по этому поводу

Говно.

5) Сходу ситуация, например нужно показать отчёт, на основе query_string скрипт получает год и выводит отчёт за этот год

Пойдёт, но можешь написать роутер, разбирающий URI типа /report/2016 если нужно.

h578b1bde ★☆
()
Последнее исправление: h578b1bde (всего исправлений: 2)
Ответ на: комментарий от h578b1bde

Приведённый тобой пример их уже исключает

Спасибо вам за ответы. Прошу прощения, я не точно выразился, мой пример все несуществующие файлы и директории отсылает на роутер, а мне нужно чтобы css/js и картинки он не обрабатывал вообще, то есть их в исключение поставить. А то сервер даёт ответ 200 на несуществующие стили, что с толку сбивает.

tonchikp
() автор топика
Ответ на: комментарий от tonchikp

А то сервер даёт ответ 200 на несуществующие стили, что с толку сбивает

Не сервер, а index.php видимо выдает страницу с сообщением, что url не найден. Тебе там надо добавить/поправить логику, чтобы на запросы js/css выдавалось 404 кодом, а не страницей.

no-such-file ★★★★★
()
Ответ на: комментарий от tonchikp

мне нужно чтобы css/js и картинки он не обрабатывал вообще

Либо засунь все *.css и *.js в отдельные каталоги (например, с именами css и js) и отфильтровывай их, добавив в начало правило

RewriteRule ^(css|js)/ - [L]
или создав в каждом из этих каталогов .htaccess с содержанием
RewriteEngine off
Либо фильтруй по расширению в имени файла
RewriteRule \.(css|js)$ - [L]
Либо, как уже сказали выше, доделай логику своего роутера. Я бы остановился на этом варианте.

h578b1bde ★☆
()
Ответ на: комментарий от no-such-file

Не сервер, а index.php видимо выдает страницу с сообщением, что url не найден. Тебе там надо добавить/поправить логику, чтобы на запросы js/css выдавалось 404 кодом, а не страницей

Нашёл ошибку, ErrorDocument 404 указывало на файл ошибок, а этот файл забыл сделать, то есть его не было. Поправил, всё работает теперь как ожидалось

tonchikp
() автор топика

И ещё связанный вопрос: нужно URL разобрать, извлечь из него Model, Viewer, Controller. Как правильнее это сделать?

1) Через .htaccess. Редиректить на index.php?controller=$1&model=$2&viewer=$3

2) Через Router (index.php). Разбор с помощью explode в массив, потом array_shift несколько раз

3) Или может какой-нибудь другой способ правильнее?

tonchikp
() автор топика
Ответ на: комментарий от h578b1bde

Огромное спасибо вам за ссылки и направления, наступило просветление, нашёл решение, исключения прописал, разобрался, всё работает.

Наткнулся вдруг на статью на Хабре, где и про ключи и про механизм обработки всё написано простым языком, не знаю как не наткнулся на неё ранее, чудеса :)

Вырвиглаз, излишняя сложность и несоответствие концепции ЧПУ

Согласен с вами, но это если пользователь видит это, а если не видит (внутренний редирект)?

tonchikp
() автор топика
Ответ на: комментарий от h578b1bde

Либо фильтруй по расширению в имени файла

RewriteRule \.(css|js)$ - [L]

Как лучше?

RewriteRule \.(css|js)$ - [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ /index.php [L,QSA]
или
RewriteCond %{REQUEST_FILENAME} !\.(css|js)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ /index.php [L,QSA]
В первом случае (на основе предложенного вами варианта), два блока правил получается, во втором случае дополнительное Cond, которое вроде как после Rule (если верить Хабру) обрабатывается

tonchikp
() автор топика
Ответ на: комментарий от tonchikp

index.php?controller=$1&model=$2&viewer=$3

ну и бред. учить дальше теорию, читать чужие сорцы, изучать популярные фреймворки. рано велосипедить.

anonymous
()
Ответ на: комментарий от tonchikp

трудно сделать верно, когда не понимаешь что делаешь, наф сед

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.