Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Перенаправление всех запросов на одну страницу (https://javascript.ru/forum/server/24318-perenapravlenie-vsekh-zaprosov-na-odnu-stranicu.html)

trikadin 26.12.2011 01:53

Перенаправление всех запросов на одну страницу
 
Собственно, как на apache сделать перенаправление любого запроса на одну страницу, чтобы при этом страница знала, откуда произошло перенаправление?

Уже понял, что mod_rewrite, но ещё не понял, как это сделать с его помощью.

Сервер-сайд на php, если что...

B@rmaley.e><e 26.12.2011 02:40

Обычно делается так:
Код:

RewriteCond %{REQUEST_FILENAME} !-f  # если не файл
RewriteCond %{REQUEST_FILENAME} !-d # и не папка
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]


trikadin 26.12.2011 04:38

B@rmaley.e><e, спасибо) Огромное.

trikadin 27.12.2011 04:58

B@rmaley.e><e, а можно при этом не палить пользователю, что собственно, перенаправление было?

Иными словами, можно ли на каждый вопрос возвращать одну и ту же страницу? Подозреваю, что тут уже нужно будет прописывать не в .htaccess, а где-то глубже...

Serg_pnz 28.12.2011 11:32

trikadin забыл упомянуть, что нужно еще сохранить запрос по которому пришли...

Мой вариант:
http://rewr002.jcase.ru/sdvdsv/test1.php?a=ewfw&b=ewef

Файлы:

.htaccess
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?q=$1 [L,QSA,R=301]


index.php
<?php
session_start();
unset($_SESSION['get']);
$_SESSION['get'] = $_GET;
header('location: test2.php');
?>


test2.php
<?php
session_start();
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
?>

B@rmaley.e><e 28.12.2011 11:54

Цитата:

Сообщение от trikadin
а можно при этом не палить пользователю, что собственно, перенаправление было?

Какое перенаправление? RewriteRule изменяет адрес для самого апача, юзеру никаких Location'ов не возвращается.

trikadin 29.12.2011 00:47

Цитата:

Сообщение от B@rmaley.e><e
Какое перенаправление? RewriteRule изменяет адрес для самого апача, юзеру никаких Location'ов не возвращается.

Эм, я, наверное, что-то не то делаю, но у меня адрес меняется.

devote 29.12.2011 01:58

я делаю всегда так:

RewriteRule ^(.*)$ index.php?%{QUERY_STRING}&include_file=%{REQUEST_FILENAME} [NC,L]
на сервер приходит переменная в $_GET['include_file'] вот в ней полный путь к файлу/папке которую юзер запросил

trikadin 29.12.2011 02:01

Да дело уже не в том, чтобы получить этот адрес - это уже, слава богу, решено - дело в том, как не перенаправлять пользователя.

devote 29.12.2011 02:03

Цитата:

Сообщение от trikadin
дело в том, как не перенаправлять пользователя.

Менять у него адрес в адресной строке? или прозрачно что бы он не видел?

B@rmaley.e><e 29.12.2011 02:06

Цитата:

Сообщение от devote
%{QUERY_STRING}

А не проще указать флаг QSA?
Цитата:

Сообщение от trikadin
Эм, я, наверное, что-то не то делаю, но у меня адрес меняется.

О_о Странно, никогда с таким не сталкивался. Можно ссылку?

trikadin 29.12.2011 02:14

Цитата:

Сообщение от B@rmaley.e><e
О_о Странно, никогда с таким не сталкивался. Можно ссылку?

На локали. Сейчас сделаю тестовый пример и куда-нибудь выложу.

devote 29.12.2011 02:22

Цитата:

Сообщение от B@rmaley.e><e
А не проще указать флаг QSA?

Ну у меня иная ситуация, я лишь часть файла htaccess показал, суть в том что мне нужно это для выязнения какой файл пользователь хотел запустить.

вобщем сам файл выглядит так:
DirectoryIndex index.php

RewriteEngine On

# Базовая директория сайта, если помещаем сайт в подкаталог, дописываем его в RewriteBase
RewriteBase /

# Все любые запросы к исполняемым файлам, проходят через файл index.php
RewriteCond %{REQUEST_FILENAME} !/index.php$
RewriteCond %{REQUEST_FILENAME} .php$
RewriteRule ^([^/]+)/(.*)/$|^([^/]+)(.*)$|^$ index.php?%{QUERY_STRING}&httpd_include_file=%{REQUEST_FILENAME} [NC,L]

# Все прочие запросы кроме файлов ресурсов проходят через index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/(.*)/$|^([^/]+)(.*)$|^$ index.php?%{QUERY_STRING} [NC,L]

Тоесть это правлило нужно если у меня существует файл например demo.php и юзер к нему хочет напрямую обратиться например в адресе написав http://mysite.ru/demo.php то происходит редирект на индексную и в переменной лежит путь к тому файлу к которому хотели напрямую обратиться, если в правилах у меня указано что туда можно напрямую обратиться, то я просто делаю инклуд к тому файлу что юзер попросил, в противном случае отдаю что-то другое... а ко всем остальным ресурсам, можно обращаться без проблем. и никуда не редиректит... Это правило я юзаю уже с давних пор, всегда работало стабильно и нареканий нет.

Цитата:

Сообщение от trikadin
На локали. Сейчас сделаю тестовый пример и куда-нибудь выложу.

Может апач как нить криво настроен

trikadin 29.12.2011 02:40

Всё, проблема решена, огромное спасибо devote.

Дело было во флаге R=301.


Часовой пояс GMT +3, время: 03:36.