Страница 1 из 2

[APACHE] Редиректы блин

Добавлено: 2009-04-03 8:35:01
zg
В общем есть такой файлик .htaccess, валяется в корне сайта

Код: Выделить всё

## ---------------------------------------------
## Описание: Файл настроек движка на ModRewrite
## Автор   : zg, 2008 год
## ---------------------------------------------

ErrorDocument 404 /error404.php

RewriteEngine On
Options +FollowSymlinks

## Текущее расположение данного файла относительно корня сайта
RewriteBase /

## Совместимость со старыми разделами
## Для работы требуется mod_alias
# ---------------------------------------------
# Статьи
RedirectMatch permanent ^/articles/vm-server/?(.*)$			/articles/os/vm/vm-server/$1
RedirectMatch permanent ^/articles/ImageCounter/?(.*)$		/articles/php/image-counter/$1
RedirectMatch permanent ^/articles/ImageList/?(.*)$			/articles/js/image-list/$1
RedirectMatch permanent ^/articles/locales/?(.*)$			/articles/php/locales/$1
RedirectMatch permanent ^/articles/mysql-charsets/?(.*)$	/articles/mysql/mysql-charsets/$1
RedirectMatch permanent ^/articles/php-common/?(.*)$		/articles/php/php-common/$1
RedirectMatch permanent ^/articles/php-net-mask/?(.*)$		/articles/php/php-net-mask/$1
RedirectMatch permanent ^/articles/php-sendmail/?(.*)$		/articles/php-sendmail-with-files/$1
RedirectMatch permanent ^/articles/sql-parser/?(.*)$		/articles/php/sql-parser/$1
RedirectMatch permanent ^/articles/xslt-first-step/?(.*)$	/articles/xml/xslt-first-step/$1
# ---------------------------------------------

## Запросы, которые идут к разделам и файлам php, направляем на индекс
RewriteCond %{REQUEST_URI} \.php$   [OR] 
RewriteCond %{REQUEST_URI} /$       [OR]
RewriteCond %{REQUEST_URI} /[^\.]+$
RewriteRule ^(.*)$ index.php?q=$1&%{QUERY_STRING} [L]
Суть сего файла сводится к следующему:
1. если был запрос на старый раздел, то отфутболить его по новому адресу
2. все остальные запросы к разделам и файлам пхп отправлять на точку входа в движок

Проблема собственно в том, что на моем домашнем сервере пашет на ура, а на хостинге делает ненужную обработку.

Домашний пример

Код: Выделить всё

zg# telnet 192.168.1.4 80
Trying 192.168.1.4...
Connected to 192.168.1.4.
Escape character is '^]'.
GET /articles/vm-server/ HTTP/1.1
Host: anton-pribora

HTTP/1.1 301 Moved Permanently
Date: Fri, 03 Apr 2009 05:28:16 GMT
Server: Apache/1.3.27 (Win32) PHP/5.2.8
Location: http://anton-pribora/articles/os/vm/vm-server/
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
Реальный хостинг

Код: Выделить всё

%telnet anton-pribora.ru 80
Trying 195.208.0.16...
Connected to anton-pribora.ru.
Escape character is '^]'.
GET /articles/vm-server HTTP/1.1
Host: anton-pribora.ru

HTTP/1.1 301 Moved Permanently
Date: Fri, 03 Apr 2009 05:24:19 GMT
Server: Apache/1.3.37 (Unix) mod_gzip/1.3.26.1a PHP/5.2.8
Location: http://anton-pribora.ru/articles/os/vm/vm-server/?q=articles/vm-server
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
на реальном хостинге подставляется ещё и параметр q, которого по идее быть не должно. Такое может быть только в том случае, если после редиректа адрес прошёл обработку через RewriteRule, а по хорошему редирект должен срабатывать сразу.

Вопрос в том как заставить апач делать редирект сразу, без последующей обработки реврайтом? (Как в первом варианте на локальном сервере)

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-03 8:54:26
LMik
По поводу ключиков реврайта посмотри, там есть какие то типа прервать дальнейшую обработку.

'last|L' (last rule)
Stop the rewriting process here and don't apply any more rewriting rules. This corresponds to the Perl last command or the break command from the C language. Use this flag to prevent the currently rewritten URL from being rewritten further by following rules. For example, use it to rewrite the root-path URL ('/') to a real one, e.g., '/e/www/'.

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-03 9:13:15
zg
LMik писал(а):По поводу ключиков реврайта посмотри, там есть какие то типа прервать дальнейшую обработку.
проблема в том, что до реврайта дело доходить и не должно. Если реврайт вырубить, то редиректы работают нормально -( А вот вместе работать они почему-то не умеют.

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-03 9:19:21
LMik
Апачи разных версий.

Редирект делается не реврайт модулем, а алиасом. Надо доку почитать че изменилось :/

Можно переписать редиректы на реврайт.

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-03 9:34:27
zg
LMik писал(а):Можно переписать редиректы на реврайт.
уже подумывал над этим, но RedirectMatch мне больше нравится. Раньше собственно и было на реврайте, просто решил сделать более изящно.
LMik писал(а):Апачи разных версий.
гм... разных, ладна, щас подниму 1.3.37 на локальном серваке.

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-03 9:52:07
zg
:cry:

Код: Выделить всё

zg# telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /articles/vm-server/ HTTP/1.1
Host: test

HTTP/1.1 301 Moved Permanently
Date: Fri, 03 Apr 2009 05:06:51 GMT
Server: Apache/1.3.39 (Unix)
Location: http://test/articles/os/vm/vm-server/?q=articles/vm-server/
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
походу и правда чего-то сломали :(

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-03 11:47:34
ProFTP
это CMS? движок никто не трогал? там модреврайт с пхп стоит?

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-03 12:00:02
zg
засада однако с этим mod_rewrite

Код: Выделить всё

zg# cat docs/.htaccess
RewriteEngine On
RewriteRule index\.php$   index1.html [L,NS]
RewriteRule index1\.html$ index2.html [L,NS]
RewriteRule index2\.html$ index3.html [L,NS]
каждое правило последнее, каждое правило запрещено использовать в подзапросах.
Создаём индексы

Код: Выделить всё

zg# echo 1 > docs/index1.html
zg# echo 11 > docs/index2.html
zg# echo 111 > docs/index3.html
zg# truncate -s 0 rewrite.log error.log
ну и проверяем, что получилось

Код: Выделить всё

zg# fetch http://test/index.php
index.php                                     100% of    4  B 2973  Bps
zg# cat index.php
111
zg#
а получилась, мягко говоря, хренатень. Если флаги убрать, то результат будет таким же, из чего я сделал вывод, что мод_реврайт чихать хотел на них... :-o

У кого какие мысли? Может всё-таки это я что-то не так делаю?

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-03 12:42:55
ProFTP
а почему оаставить нормально нельзя?

там гемороя много вообще-то, там как-то модно сделать по-моиму без мод_реврайта, во многих фремворках ЮРЛ красивая site.com/df/df/df/df

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-03 12:55:54
zg
ProFTP писал(а):а почему оаставить нормально нельзя?
первое правило сайтописателя - никогда не оставляй битых ссылок. У меня сайт щас ширится, поэтому нужно продумать механизм обратной совместимости ссылок. Пока сделал на поганом реврайте

Код: Выделить всё

# Статьи
RewriteRule ^articles/vm-server/?(.*)$			/articles/os/vm/vm-server/$1 [R=301,L]
...
ProFTP писал(а):там как-то модно сделать по-моиму без мод_реврайта
на апаче только через 404 ошибку и мод_реврайт можно нормальные ссылки сделать.

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-03 13:52:19
ProFTP
а сайт не динамический? допустим если данных в СУБД нету, то вывести что-то другое.... разве там будет битая ссылка?

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-03 13:57:41
zg
ProFTP писал(а):допустим если данных в СУБД нету, то вывести что-то другое
движок не привязан к субд
ProFTP писал(а):разве там будет битая ссылка?
там не только разделы и таксты, там ещё картинки и файлы. Можно конечно и их отдавать через скрипт, но смысла в этом мало. Лучше урл подправить и сделать редирект.

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-06 18:19:32
kmb
вообщем-то тоже редиректы и апач, поэтому спрошу в этой теме:
internet - forward port(proxy) - www(apache)
На последнем нужно увидеть реальный ip, а не ip прокси... Голову сломал уже, раньше как-то делал, то ли через модуль realip или еще какой-то, сейчас не получается, а срочно надо =/

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-06 19:54:03
kmb
nginx+realip помогли

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-18 21:45:34
Dmitriy_K
Может кто подскажет почему не срабатывает простой редирект на другую директорию?
Нужно перекинуть запрос файла с некоего урл: domen/common/
где domen - директория сайта
на common.www4you.ru/htdocs/

DocumentRoot "/home/domen/htdocs"
/home/domen/htdocs/ru - директория индексного файла
/home/common.www4you.ru/htdocs/ - где нужно брать файлы при запросе: domen/common/

Код: Выделить всё

RewriteEngine   on
RewriteCond %{REQUEST_URI} ^(/|/index.php)$ [NC]
RewriteRule ^(.*)$ /ru/$1
RewriteRule ^(common/)$ (home/common.www4you.ru/htdocs/)
Почему-то не срабатывает...

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-18 21:52:27
zg
Dmitriy_K писал(а):RewriteRule ^(common/)$ (home/common.www4you.ru/htdocs/)
так нельзя насколько я знаю. Можешь включить логи проследить как происходит обработка.
Dmitriy_K писал(а): где нужно брать файлы при запросе: domen/common/
для этого лучше алиас используй

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-19 9:28:15
Dmitriy_K
Посмотрел ошибки сайта в Apache. В случае использования "Rewrite" выдаётся:

Код: Выделить всё

Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden: /home/domen/common/htdocs/css/style.css, referer: http://*****
В случае использования "Alias" выдаётся:

Код: Выделить всё

client denied by server configuration: /home/domen/common/htdocs/css/style.css, referer: http://*****
Пока не разобрался как с этим бороться. Например, включение "Options FollowSymLinks" для первого варианта не помогло.

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-19 9:34:09
zg
Dmitriy_K писал(а):client denied by server configuration
смотри в сторону прав и .htaccess в целевой папке
Dmitriy_K писал(а):Options FollowSymLinks
Там перед "реврай он" поставь

Код: Выделить всё

Options +FollowSymLinks
и проверь права на папку, потом смотри опять какая ошибка лезет

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-19 19:18:42
Dmitriy_K
zg писал(а):Там перед "реврай он" поставь

Код: Выделить всё

Options +FollowSymLinks
и проверь права на папку, потом смотри опять какая ошибка лезет
Это не помогло, но сделал логирование "Rewrite" и увидел, что изменение путей через него возможно только в пределах корневой папки сайта. А мне нужно как-то перепрыгнуть за её пределы, чтобы загрузить графику.
Надо придумать какое-то регулярное выражение вместо прямого указания типа:

Код: Выделить всё

RewriteRule ^/common(.*)    /home/common/htdocs$1 [R=301]
В папке "/home" куча сайтов, и всем нужен этот редирект. :(

С "Alias" пока не проходит, поскольку у него тоже определяется зона действия <Directory "/*****">, и я не знаю как в неё вписаться. Пока идут ошибки конфига: "Alias not allowed here"

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-19 19:54:32
zg
Dmitriy_K писал(а):С "Alias" пока не проходит, поскольку у него тоже определяется зона действия <Directory "/*****">
дак определи -)

Код: Выделить всё

    #
    # Alias: Maps web paths into filesystem paths and is used to
    # access content that does not live under the DocumentRoot.
    # Example:
    # Alias /webpath /full/filesystem/path
    #
    # If you include a trailing / on /webpath then the server will
    # require it to be present in the URL.  You will also likely
    # need to provide a <Directory> section to allow access to
    # the filesystem path.

Код: Выделить всё

Alias /common    /home/common/htdocs
<Directory /home/common/htdocs>
Allow form all
</Directory>

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-19 21:18:44
Dmitriy_K
Прямо не помогло, но спасибо, кое-что понял. Использовал:

Код: Выделить всё

<DirectoryMatch> ^/usr/home/*>
Allow from all
</DirectoryMatch>
"Alias" почему-то упорно не проходит. Попробовал варианты типа:

Код: Выделить всё

RewriteRule ^/common(.*)    /usr/home/rbk/common.igopen.www4you.ru/htdocs$ [R=301,S=2]
Близко к попаданию, но почему-то пока срабатывает два раза последовательно (две одинаковых записи в урл). Что-то не так в синтаксисе. Я не разобрался с использованием там "$". Пока получаю "File does not exist:".

Re: [APACHE] Редиректы блин

Добавлено: 2009-04-20 21:38:51
Dmitriy_K
Пока получился рабочий вариант с "Alias":

Код: Выделить всё

Alias /common /home/domen/common/htdocs
# И обязательно разрешения переходов по рабочим каталогам:
<DirectoryMatch> ^/home/domen/*>
Options SymLinksifOwnerMatch
Allow from all
</DirectoryMatch>
Но ещё не понял почему не проходят варианты, которые в литературе по Apache представлены как равнозначные этому:

Код: Выделить всё

Alias ^/common(.*)    /usr/home/rbk/common.igopen.www4you.ru/htdocs$1
и
RewriteRule ^/common(.*)    /usr/home/rbk/common.igopen.www4you.ru/htdocs$1

Re: [APACHE] Редиректы блин

Добавлено: 2009-05-16 15:56:57
ProFTP
я хотел спросить

есть CMS, какие-то статьи/разделы будут удалены, то как сделать чтобы они не были битые ссылки...

чтобы ссылки на удаленные статьи сохранились, точнее чтобы редиректило на другую определенную стаью, но тчобы ссылки сохрались как бы...

не шарю, какие тут варианты?

Re: [APACHE] Редиректы блин

Добавлено: 2009-05-16 15:59:55
zg
ProFTP писал(а):не шарю, какие тут варианты?
да почти никаких, может поможет http://anton-pribora.ru/articles/www/apache/redirects/

Re: [APACHE] Редиректы блин

Добавлено: 2009-05-16 16:06:40
ProFTP
не много не понял

есть

от site.com?articles=10 до site.com?articles=1000

в этом диапазоне, могут быть битые...

примерно так, но не похоже что-то

Код: Выделить всё

RewriteRule ^articles/?(.*)$  /articles/$1 [R=301,L]
куда оно будет редиректить?

тут надо движок ковырять?
или mod_rewrite справится?