Ru-Board.club
← Вернуться в раздел «Web-программирование»

» mod_rewrite: документация, готовые решения, вопросы

Автор: AndreySm
Дата сообщения: 27.06.2008 21:12
На хостинге в корне стоит сайт, другой поставили в поддиректорию.
В .htaccess записано так:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) /index.php?QUERY=$1&%{QUERY_STRING} [L]

Но при нем не открывается сайт из поддиректории, а пока нужно оставить старый и наполнить новый.
Если файл убираешь - то сайт из поддомена открывается, но не работает основной.
Как можно открыть доступ одновременно к двум сайтам ?
Автор: Cheery
Дата сообщения: 27.06.2008 21:15
AndreySm

Цитата:
Как можно открыть доступ одновременно к двум сайтам ?

добавить
RewriteCond %{HTTP_HOST} ^subdomain
Автор: AndreySm
Дата сообщения: 27.06.2008 21:40
Добавление
RewriteCond %{HTTP_HOST} ^сайт.ru/подпапка/
не помогает
Автор: Cheery
Дата сообщения: 27.06.2008 21:42
AndreySm

Цитата:
RewriteCond %{HTTP_HOST} ^сайт.ru/подпапка/
не помогает

а может не надо отсебятины? я, вроде бы, указал что нужно..

указываем просто имя поддомена, для которого хотим применить.
или пишем так
RewriteCond %{HTTP_HOST} !^subdomain
для того, для которого не хотим, чтобы применялось
Автор: AndreySm
Дата сообщения: 27.06.2008 21:54
При чем тут субдомен ?
сайт.ру все ведет на основной сайт
в подпапке /подпапка/ другой сайт
при оригинальном файле подпапка не открывается, с вашим добавлением не работает основной сайт - но подпапка открывается, как самого файла вообще нет.
Автор: Cheery
Дата сообщения: 27.06.2008 21:56
AndreySm

Цитата:
При чем тут субдомен ?

откуда я знаю какой "другой" сайт.. значит заменяете subdomain на имя другого сайта, но без пути и экранируя точки как \. (хотя и необязательно)

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

Цитата:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) /index.php?QUERY=$1&%{QUERY_STRING} [L]

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


глупость какая то.. данная запись проверяет лишь есть ли файл или нет и если нет, то перекидывает на index.php

если document_root для второго сайта настроен именно на подпапку, то он даже htaccess в этой внешней директории смотреть не будет


ps: или поясняйте свое "второй сайт".
Автор: AndreySm
Дата сообщения: 27.06.2008 22:04
на одном домене 2 сайта
1. сайт.ру
2. сайт.ру/подпапка/
при оригинальном коде файла, который я привел - не открывает сайт.ру/подпапка/
с вашими подсказками не открывает ссылки с сайт.ру , но открывает сайт.ру/подпапка/
то же самое если просто удалить файл .htaccess
вроде понятно описал
Автор: Cheery
Дата сообщения: 27.06.2008 22:08
AndreySm

Цитата:
на одном домене 2 сайта

ну так не путайте людей.. это не "2 сайта".


Цитата:
при оригинальном коде файла, который я привел - не открывает сайт.ру/подпапка/

приведенный код на это не влияет.
еще раз - он проверяет существует ли файл, который запрошен, и если нет, то перебрасывает на index.php
так что дело не в нем.

Цитата:
RewriteCond %{REQUEST_FILENAME} !-f

вот это условие - не существует файл который запрошен
тогда выполняется это


Цитата:
RewriteRule ^(.*) /index.php?QUERY=$1&%{QUERY_STRING} [L]

любой запрос переходит в /index.php?QUERY=запрос&строка_запроса


можно попробовать добавить
RewriteCond %{REQUEST_FILENAME} !-d
это проверка есть ли директория с таким именем
Автор: AndreySm
Дата сообщения: 27.06.2008 22:26
понятно, т.е. к доступу просто задавать имя начального файла сайта в подпапке
в течении работы не страшно, дальше тормозит - но работает
и RewriteCond %{REQUEST_FILENAME} !-d помогло
спасибо !
Автор: Delphi6
Дата сообщения: 08.07.2008 13:27
Что то не могу сообразить почему у меня циклиться mod_rewrite, может кто в курсе?

Код: # rewrite subdomain requests to subdirectories except for www.example.com
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/subdomains/
RewriteCond %{REQUEST_URI} !^/favicon.ico
RewriteCond %{REQUEST_URI} !^/404error.htm
RewriteCond %{HTTP_HOST} !^www\.sitename\.eu$ [NC]
RewriteCond %{HTTP_HOST} ^([^.]+)\.sitename\.eu$ [NC]
RewriteRule (.*) /subdomains/%1/$1 [L]

# redirect www.example.com/subdomains/<sub-domain>/<page> to <sub-domain>.example.com/<page>
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.+)\ HTTP/
RewriteRule ^subdomains/([^/]+)/(.*)$ http://$1.sitename.eu/$2 [R=301,L]

ErrorDocument 403 http://sitename.eu/404error.htm
ErrorDocument 404 http://sitename.eu/404error.htm
ErrorDocument 500 http://sitename.eu/404error.htm
Автор: Cheery
Дата сообщения: 08.07.2008 17:40
Delphi6

Цитата:
Что то не могу сообразить почему у меня циклиться mod_rewrite, может кто в курсе?

для таких вещей есть логирование действий mod_rewrite
включаем на время.. потом смотрим логи.

очевидно, что связано с перекидыванием на 404 страницу


Цитата:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.+)\ HTTP/

странная запись
Автор: Delphi6
Дата сообщения: 08.07.2008 19:39
Cheery

Цитата:
странная запись

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

Спасибо помогло Вот и ошибка, правда теперь не знаю как пофиксить...
http://sub.sitename.eu/bla-bla.html
или тоже самое что в оригинале
http://sitename.eu/subdomains/sub/bla-bla.html
[more=mod_rewrite.log][rid#84f3050/initial] (3) [perdir /home/sitename/www/] strip per-dir prefix: /home/sitename/www/bla-bla.htm -> bla-bla.htm
[rid#84f3050/initial] (3) [perdir /home/sitename/www/] applying pattern '(.*)' to uri 'bla-bla.htm'
[rid#84f3050/initial] (4) [perdir /home/sitename/www/] RewriteCond: input='/bla-bla.htm' pattern='!^/subdomains/' => matched
[rid#84f3050/initial] (4) [perdir /home/sitename/www/] RewriteCond: input='/bla-bla.htm' pattern='!^/favicon.ico' => matched
[rid#84f3050/initial] (4) [perdir /home/sitename/www/] RewriteCond: input='/bla-bla.htm' pattern='!^/404error.htm' => matched
[rid#84f3050/initial] (4) [perdir /home/sitename/www/] RewriteCond: input='dom.sitename.eu' pattern='!^www\.sitename\.eu$' [NC] => matched
[rid#84f3050/initial] (4) [perdir /home/sitename/www/] RewriteCond: input='dom.sitename.eu' pattern='^([^.]+)\.sitename\.eu$' [NC] => matched
[rid#84f3050/initial] (2) [perdir /home/sitename/www/] rewrite 'bla-bla.htm' -> '/subdomains/dom/bla-bla.htm'
[rid#84f3050/initial] (1) [perdir /home/sitename/www/] internal redirect with /subdomains/dom/bla-bla.htm [INTERNAL REDIRECT]
[rid#84fa7b0/initial/redir#1] (3) [perdir /home/sitename/www/] strip per-dir prefix: /home/sitename/www/subdomains/dom/bla-bla.htm -> subdomains/dom/bla-bla.htm
[rid#84fa7b0/initial/redir#1] (3) [perdir /home/sitename/www/] applying pattern '(.*)' to uri 'subdomains/dom/bla-bla.htm'
[rid#84fa7b0/initial/redir#1] (4) [perdir /home/sitename/www/] RewriteCond: input='/subdomains/dom/bla-bla.htm' pattern='!^/subdomains/' => not-matched
[rid#84fa7b0/initial/redir#1] (3) [perdir /home/sitename/www/] strip per-dir prefix: /home/sitename/www/subdomains/dom/bla-bla.htm -> subdomains/dom/bla-bla.htm
[rid#84fa7b0/initial/redir#1] (3) [perdir /home/sitename/www/] applying pattern '^subdomains/([^/]+)/(.*)$' to uri 'subdomains/dom/bla-bla.htm'
[rid#84fa7b0/initial/redir#1] (4) [perdir /home/sitename/www/] RewriteCond: input='GET /bla-bla.htm HTTP/1.1' pattern='^[A-Z]{3,9}\ /(.+)\ HTTP/' => matched
[rid#84fa7b0/initial/redir#1] (4) [perdir /home/sitename/www/] RewriteCond: input='/subdomains/dom/bla-bla.htm' pattern='!^/404error.htm' => matched
[rid#84fa7b0/initial/redir#1] (2) [perdir /home/sitename/www/] rewrite 'subdomains/dom/bla-bla.htm' -> 'http://dom.sitename.eu/bla-bla.htm'
[rid#84fa7b0/initial/redir#1] (2) [perdir /home/sitename/www/] explicitly forcing redirect with http://dom.sitename.eu/bla-bla.htm
[rid#84fa7b0/initial/redir#1] (1) [perdir /home/sitename/www/] escaping http://dom.sitename.eu/bla-bla.htm for redirect
[rid#84fa7b0/initial/redir#1] (1) [perdir /home/sitename/www/] redirect to http://dom.sitename.eu/bla-bla.htm [REDIRECT/301]
[rid#84fa050/initial] (3) [perdir /home/sitename/www/] strip per-dir prefix: /home/sitename/www/bla-bla.htm -> bla-bla.htm
[rid#84fa050/initial] (3) [perdir /home/sitename/www/] applying pattern '(.*)' to uri 'bla-bla.htm'
[rid#84fa050/initial] (4) [perdir /home/sitename/www/] RewriteCond: input='/bla-bla.htm' pattern='!^/subdomains/' => matched
[rid#84fa050/initial] (4) [perdir /home/sitename/www/] RewriteCond: input='/bla-bla.htm' pattern='!^/favicon.ico' => matched
[rid#84fa050/initial] (4) [perdir /home/sitename/www/] RewriteCond: input='/bla-bla.htm' pattern='!^/404error.htm' => matched
[rid#84fa050/initial] (4) [perdir /home/sitename/www/] RewriteCond: input='dom.sitename.eu' pattern='!^www\.sitename\.eu$' [NC] => matched
[rid#84fa050/initial] (4) [perdir /home/sitename/www/] RewriteCond: input='dom.sitename.eu' pattern='^([^.]+)\.sitename\.eu$' [NC] => matched
[rid#84fa050/initial] (2) [perdir /home/sitename/www/] rewrite 'bla-bla.htm' -> '/subdomains/dom/bla-bla.htm'
[rid#84fa050/initial] (1) [perdir /home/sitename/www/] internal redirect with /subdomains/dom/bla-bla.htm [INTERNAL REDIRECT]
[rid#84f37b0/initial/redir#1] (3) [perdir /home/sitename/www/] strip per-dir prefix: /home/sitename/www/subdomains/dom/bla-bla.htm -> subdomains/dom/bla-bla.htm
[rid#84f37b0/initial/redir#1] (3) [perdir /home/sitename/www/] applying pattern '(.*)' to uri 'subdomains/dom/bla-bla.htm'
[rid#84f37b0/initial/redir#1] (4) [perdir /home/sitename/www/] RewriteCond: input='/subdomains/dom/bla-bla.htm' pattern='!^/subdomains/' => not-matched
[rid#84f37b0/initial/redir#1] (3) [perdir /home/sitename/www/] strip per-dir prefix: /home/sitename/www/subdomains/dom/bla-bla.htm -> subdomains/dom/bla-bla.htm
[rid#84f37b0/initial/redir#1] (3) [perdir /home/sitename/www/] applying pattern '^subdomains/([^/]+)/(.*)$' to uri 'subdomains/dom/bla-bla.htm'
[rid#84f37b0/initial/redir#1] (4) [perdir /home/sitename/www/] RewriteCond: input='GET /bla-bla.htm HTTP/1.1' pattern='^[A-Z]{3,9}\ /(.+)\ HTTP/' => matched
[rid#84f37b0/initial/redir#1] (4) [perdir /home/sitename/www/] RewriteCond: input='/subdomains/dom/bla-bla.htm' pattern='!^/404error.htm' => matched
[rid#84f37b0/initial/redir#1] (2) [perdir /home/sitename/www/] rewrite 'subdomains/dom/bla-bla.htm' -> 'http://dom.sitename.eu/bla-bla.htm'
[rid#84f37b0/initial/redir#1] (2) [perdir /home/sitename/www/] explicitly forcing redirect with http://dom.sitename.eu/bla-bla.htm
[rid#84f37b0/initial/redir#1] (1) [perdir /home/sitename/www/] escaping http://dom.sitename.eu/bla-bla.htm for redirect
[rid#84f37b0/initial/redir#1] (1) [perdir /home/sitename/www/] redirect to http://dom.sitename.eu/bla-bla.htm [REDIRECT/301][/more]
Автор: Cheery
Дата сообщения: 08.07.2008 19:51
Delphi6
проблема в том, что в начале преобразует в /subdomains/..

Цитата:
RewriteCond %{REQUEST_URI} !^/subdomains/
RewriteCond %{REQUEST_URI} !^/favicon.ico
RewriteCond %{REQUEST_URI} !^/404error.htm
RewriteCond %{HTTP_HOST} !^www\.sitename\.eu$ [NC]
RewriteCond %{HTTP_HOST} ^([^.]+)\.sitename\.eu$ [NC]
RewriteRule (.*) /subdomains/%1/$1 [L]


а потом обратно через 301

Цитата:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.+)\ HTTP/
RewriteRule ^subdomains/([^/]+)/(.*)$ http://$1.sitename.eu/$2 [R=301,L]

хоть и стоит [L], но правила опять проходятся

поэтому лучше сначала описать какой нужен результат
Автор: Delphi6
Дата сообщения: 09.07.2008 04:55
Cheery

Цитата:
поэтому лучше сначала описать какой нужен результат

Ничего особенного, всего у меня есть несколько вариантов как пользователь набрал url, вот все варианты (везде где есть слова bla-bla это означает что такого файла или директории не сушествует):

1) http://sitename.eu/subdomains/sub/exist-file.html
2) http://sub.sitename.eu/exist-file.html
4) http://sitename.eu/bla-bla/bla-bla.html
4) http://sitename.eu/subdomains/sub/bla-bla.html
5) http://sub.sitename.eu/bla-bla.html

в первом случае пользователь или допустим гугл бот попытался обратиться к файлу напрямую через саб директории (допустим где-то случайно засветил), я его по этому редиректю на второй url, что мол первого реально не существует Если же пользователь набрал второй url то ясно все отображается как надо. В третьем случае так как urlа нет срабатывает ошибка 404 и идет редирект на http://sitename.eu/404error.htm это тоже работает. Но вот последние четвертый и пятый варианты должны тоже редиректить на http://sitename.eu/404error.htm так как они не существуют... но вместо этого они конвертяться то в одну форму то в другую... может есть возможность проверить RewriteCond-ом на наличие ошибок 403, 404, 500 и в случае если они есть то уже не делать конвератицю? (автоматом сработают ErrorDocument)


Цитата:
хоть и стоит [L], но правила опять проходятся

наверно потому что срабатывает 404 Но каждый раз до него не доходит Пытался уже перенести в начало, но я не знаю как сделать что если сработал участок ErrorDocument тогда прекратить проверку... да и нельзя как я понимаю в начало переносить и потом тормозить, ведь в реале и второго урла нет и на него тоже 404 должен сработать
Автор: Delphi6
Дата сообщения: 10.07.2008 13:50
Временно я удалил вот этот кусок:

Код: RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.+)\ HTTP/
RewriteRule ^subdomains/([^/]+)/(.*)$ http://$1.sitename.eu/$2 [R=301,L]
Автор: DJSERV
Дата сообщения: 12.07.2008 17:59
Никак не пойму, подскажите:
есть урл
http://test2.ru/news_read?52425.php
надо отправить его по запросу
index.php?catalog=content&link=52425

Пытаюсь


Код: RewriteRule news_read\?([0-9]+).php$ index.php?catalog=content&link=$1 [L]
Автор: Delphi6
Дата сообщения: 12.07.2008 18:08
DJSERV

Цитата:
news_read was not found on this server.

А вы уверены что у вас вообще включен и разрешен mod_rewrite? Может и глупый вопрос но, вы случаем не забыли про RewriteEngine On? Если вы впервые с mod_rewrite-ом работаете то советую почитать цикл статей (4 коротенькие) указанных в шапке...
Автор: DJSERV
Дата сообщения: 12.07.2008 21:19
RewriteEngine включён.
Но файл index у меня находится в папке /temp. Чтобы отправить туда запрос ниже пишу

RewriteCond %{REQUEST_FILENAME} !temp/.* [NC]
RewriteRule (.*) /temp/$1 [L]

Попробовал без знака ? - всё отлично. Но вот со знаком не работает.
Автор: Delphi6
Дата сообщения: 13.07.2008 04:23
DJSERV

Цитата:
Но файл index у меня находится в папке /temp.

Вот это уже частично проливает свет на проблему Если можно приведите весь кусок из .htaccess который отвечает за редирект, я посмотрю на практике что там происходит и если надо подправлю.
Автор: DJSERV
Дата сообщения: 13.07.2008 09:43
Да вроде как больше ничего такого нет.


Код:
RewriteEngine On
RewriteRule news_read\?([0-9]+).php$ index.php?catalog=content&link=$1 [L]

RewriteRule read-([0-9]+)-?([0-9]+)? index.php?catalog=$1&link=$2 [L]
RewriteRule main-([0-9]+)? index.php?catalog=0&link=$1 [L]

RewriteCond %{REQUEST_FILENAME} !temp/.* [NC]
RewriteRule (.*) /temp/$1 [L]

Автор: Delphi6
Дата сообщения: 13.07.2008 14:08
DJSERV

Цитата:
http://test2.ru/news_read?52425.php

Тфу блин... как всегда упустишь что-то банальное Дело в том что RewriteRule не захватывает весь "news_read?52425.php" а только "news_read" так как вопросительный знак указывает что после него все что идет это данные предаваемые скрипту методом GET... сейчас начал думать как решить проблему...

Добавлено:
А вот и решение

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/news_read
RewriteCond %{QUERY_STRING} ^([0-9]+)\.php$
RewriteRule .* index.php?catalog=content&link=%1 [L]
Автор: zerkms
Дата сообщения: 14.07.2008 09:08
Delphi6
вот только смысла мало использовать такие странные, мягко говоря, урлы, когда под рукой есть модреврайт
Автор: Delphi6
Дата сообщения: 14.07.2008 18:50
zerkms

Цитата:
вот только смысла мало использовать такие странные, мягко говоря, урлы, когда под рукой есть модреврайт

Это вы не по адресу Вам с таким вопросом и предложением непосредственно к DJSERV. Я же в свою очередь просто указал как решается его проблема. Хотя не вариант что у DJSERV был выбор какой входящий урл он хочет, возможно какой-то движок генерить такой урл, а ему нужно его передать в другом формате уже другому движку...
Автор: LenaSh
Дата сообщения: 06.09.2008 22:22
StasM
Добрый день.
Будьте добры подскажите как реализовать, чтобы
при запросе URLs вида http://www.my_domen.ru/page?N, где N – любой численный или строковый параметр, для всех внутренних страниц сайта желательно, чтобы сервер отдавал ответ HTTP/1.1 404 Not Found.
Как это осуществить? какой код вставить в файл .htaccess
Автор: LenaSh
Дата сообщения: 08.09.2008 10:05
Добрый день. Люди!!!!! Будьте добры подскажите как реализовать, чтобы
при запросе URLs вида http://www.my_domen.ru/page?N, где N – любой численный или строковый параметр, для всех внутренних страниц сайта желательно, чтобы сервер отдавал ответ HTTP/1.1 404 Not Found.
Как это осуществить? какой код вставить в файл .htaccess
Автор: Alexeyymanikin
Дата сообщения: 28.09.2008 19:15

http://www.beget.ru/art9.html - хорошая статья по mod_rewrite очень помогла все в одном месте, а также множество приемером http://www.beget.ru/art10.html
Автор: OLEX
Дата сообщения: 27.10.2008 07:01
Вопрос по mod_rewrite

Вот по такому правилу
RewriteRule ^(.*)show_(.+)_(.+)_(.+)\.html$ /cgi-bin/forum.cgi?topic=$2&page=$3#post_$4
Апачь открывает страницу show_16_3_40.html
как /cgi-bin/forum.cgi?topic=16&page=3%23post_40
Ну и ссылка на якорь получается не работает
Как это побороть?
Автор: ra1n
Дата сообщения: 27.10.2008 09:04
Добрый день

есть сайт, проиндексирован в яндексе без www, а надо с ними
сказали что mod_rewrite мне поможет

Цитата:
Чтобы сайт был с www, нужно сделать 301 редирект. Как это сделать? Например, используя .htaccess


Можете подсказать, как это сделать?
Автор: Cheery
Дата сообщения: 27.10.2008 17:59
OLEX

Цитата:
Как это побороть?


Цитата:
RewriteRule ^(.*)show_(.+)_(.+)_(.+)\.html$ /cgi-bin/forum.cgi?topic=$2&page=$3#post_$4 [NE]


ra1n

Цитата:
Можете подсказать, как это сделать?

RewriteCond %{HTTP_HOST} ^site$
RewriteRule ^(.*)$ http://www.site$1
Автор: OLEX
Дата сообщения: 27.10.2008 21:06
Cheery Спасибище

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

Предыдущая тема: PHP: Регулярные выражения (RegExp, Regular, eregi, preg)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.