За последние 24 часа нас посетили 17804 программиста и 1716 роботов. Сейчас ищут 1728 программистов ...

Помогите с RewriteRule

Тема в разделе "PHP для новичков", создана пользователем vitaliyw, 3 авг 2006.

  1. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    а на этом вашем денвере mod_rewrite установлен? :)
     
  2. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    я балдею 8)
     
  3. Border

    Border Активный пользователь

    С нами с:
    22 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    Заменяю ссылки вида somehost/index.php?Page_ID=name
    на somehost/index/name

    Файл .htaccess
    Код (Text):
    1. RewriteEngine On
    2. Options +FollowSymlinks
    3. RewriteBase /
    4. RewriteRule ^(.*)index/(.*)$ $1index.php?Page_ID=$2
    Не знаю, оптимально ли это делаю, но работает, $_GET["Page_ID"] в index.php передается. По крайней мере, по
    PHP:
    1. echo $_GET["Page_ID"];
    выводится name.
    Но перестает подключаться файл стилей
    Код (Text):
    1. <link href="Common/main2.css" rel="stylesheet" type="text/css">
    Не понимаю почему?

    Если в index.php задать в явном виде
    PHP:
    1. <?$Page_ID=name;?>
    , то все работает
     
  4. Border

    Border Активный пользователь

    С нами с:
    22 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    с mod_rewrite не связано ...
    поправил
    Код (Text):
    1. <link href="Common/main2.css" ...>
    на
    Код (Text):
    1. <link href="/Common/main2.css" ...>
    заработало.
    Правда все равно не понятно почему раньше работало при запуске index.php, а при переходе по ссылке не работало ...
     
  5. def

    def Активный пользователь

    С нами с:
    24 апр 2006
    Сообщения:
    230
    Симпатии:
    0
    Адрес:
    Питер
    Видимо так, все-таки, если я правильно понял что нужно.

    Код (Text):
    1.  
    2. RewriteRule ^index/(.*)/?$ index.php?Page_ID=$1
     
  6. Border

    Border Активный пользователь

    С нами с:
    22 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    Работает и так и так. Хочу просто убрать get-параметры из ссылок.
    А для чего в данном случае "/?" ?
     
  7. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    означает "/" может быть, а может и небыть
     
  8. Border

    Border Активный пользователь

    С нами с:
    22 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    Спасибо.
    Т.е., правильно ли я понимаю, если у меня все ссылки вида somehost/index/name, то эту ("/?") проверку можно убрать? Если ее оставить, то будут допустимы обращения по адресу somehost/index/name/
     
  9. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    копайте в сторону относительных и абсолютных путей.

    лучше не убирать. в случае с "/?" будут допустимы ссылки и со слэшами на конце, и без них.
     
  10. Border

    Border Активный пользователь

    С нами с:
    22 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    Разницу между относительными и абсолютными путями понимаю вроде бы :) ("Common/main2.css" - абсолютный, "/Common/main2.css" - относительно корневого каталога, "../Common/main.css" - относительно каталога рангом выше. Эт я на всякий случай свое понимание проверяю.. ).
    Может быть неправильно объяснил:
    Линк на файл стилей сидит в шаблоне, который вызывается из index.php . Так вот если запускал index.php обращением к адресу localhost/index.php?Page_ID=name, то нужная страница открывалась, НО файл стилей не подключался. А если прописывал в index.php строчку $Page_ID=name; то подключался. Вот мне и не понятно как подключение файла стилей зависит от того каким образом переменная $Page_ID попадает в скрипт ... поэтому думал, что может чего-то с mod_rewrite намудрил ...
     
  11. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    заблуждаешься...
    "/Common/main2.css" - абсолютный путь.
    "Common/main2.css" - путь, относительно текущего каталога.

    лучше указывать абсолютные пути.
     
  12. Border

    Border Активный пользователь

    С нами с:
    22 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    ОК. Спасибо .. а по второму вопросу .. почему так может происходить?
     
  13. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Border
    обращался к адресу-то как?
    localhost/index/name ?
     
  14. Border

    Border Активный пользователь

    С нами с:
    22 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    Да. Сделал тестовую html страничку и поставил там <a href="http://localhost/index/name">Name</a>
     
  15. simpson

    simpson Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    ну вот и файл стилей пытался подключиться отсюда:
    localhost/index/name/Common/main2.css
    относительно localhost/index/name ... но его там нет.
     
  16. Border

    Border Активный пользователь

    С нами с:
    22 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    Вроде просветляется :) .. большое спасибо.

    ЗЫ. Примерял абсолютность и относительность к физическому расположению файлов, а не к адресу запроса ... заблуждался :)
     
  17. Border

    Border Активный пользователь

    С нами с:
    22 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    Сменил идеологию организации внутренних ссылок. Раз все-равно приходится обрабатывать GET-параметры ссылок в index.php, то почему бы сразу не перенаправлять все запросы на index.php в ЧПУ виде, а затем разбирать URI и формировать вывод.
    Горбунов Олег давал ссылку на описание как это реализовать с помощью .htaccess. Я пару дней повозился не получается. Может быть действительно ForceType не работает, если PHP подключен не как модуль, может руки кривые - не знаю :D . Сделал это через mod_rewrite:
    Код (Text):
    1. RewriteEngine On
    2. Options +FollowSymlinks
    3. RewriteBase /
    4.  
    5. # всех входящих не с myhost на index.php
    6. RewriteCond %{HTTP_REFERER} !http://myhost.*
    7. RewriteRule  .*  index.php
    8.  
    9. # для разрешения внутренних обращений например к файлам стиля или рисункам ..
    10. RewriteCond %{HTTP_REFERER} http://myhost.*
    11. RewriteRule  !(Common/.*)  index.php
    Вот вторая часть (для внутренних обращений) мне и не нравится.. Т.е. нужно либо все подключаемые по http файлы хранить в одном каталоге Common, либо для каждого нужного каталога прописывать разрешение в mod_rewrite. Собственно, это вопрос :)
     
  18. def

    def Активный пользователь

    С нами с:
    24 апр 2006
    Сообщения:
    230
    Симпатии:
    0
    Адрес:
    Питер
    Код (Text):
    1.  
    2. RewriteEngine on
    3. Options +FollowSymlinks
    4.  
    5. RewriteCond %{REQUEST_FILENAME} !-s
    6. RewriteCond %{REQUEST_FILENAME} !-d
    7.  
    8. RewriteRule .* index.php
    имхо, так удобнее.

    ps. подключаемые с помощью php файлы, обрабатываются вообще то не через http ;)
     
  19. Border

    Border Активный пользователь

    С нами с:
    22 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    У меня ссылки вида myhost/path/to/somewhere. Они на самом деле короче (myhost/somewhere), но это не меняет сути дела.
    Если somewhere совпадает с локальной папкой на сервере (например myhost/home и папка home), то в Вашем варианте откроется папка.

    Я имел ввиду обращение через href="http:// ..." файл стилей, например, (в этой ветке с этого и начал вопросы) ...
    или, например, рисунок <img src="/path/to/Pic">
     
  20. def

    def Активный пользователь

    С нами с:
    24 апр 2006
    Сообщения:
    230
    Симпатии:
    0
    Адрес:
    Питер
    а ты код мой вообще посмотрел ? )

    Код (Text):
    1.  
    2. RewriteCond %{REQUEST_FILENAME} !-s
    3. RewriteCond %{REQUEST_FILENAME} !-d
    Наверное, не для красоты )
     
  21. Border

    Border Активный пользователь

    С нами с:
    22 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    Я не только посмотрел, но и проверил ..
     
  22. def

    def Активный пользователь

    С нами с:
    24 апр 2006
    Сообщения:
    230
    Симпатии:
    0
    Адрес:
    Питер
    тогда не очень понятна твоя реакция.
    ты ж ничего не сказал, проверял ты или нет, если проверял, что именно не работает, если не работает.

    подробности в студию.
     
  23. Border

    Border Активный пользователь

    С нами с:
    22 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    Вроде бы старался все понятно объяснить. Мой вариант - если не с моего хоста, то на index.php, далее разбираю URI и выдаю нужную страницу. Чтобы подгружался стиль и картинки добавил второе правило.
    В твоем варианте, если я захожу с localhost на http://myhost/home , то открывается не страница home, а папка home на сервере.
     
  24. Anonymous

    Anonymous Guest

    Кстати я для css и картинок делал проще..
    Код (Text):
    1.  
    2. RewriteRule  ^*.css$ - [PT]
     
  25. def

    def Активный пользователь

    С нами с:
    24 апр 2006
    Сообщения:
    230
    Симпатии:
    0
    Адрес:
    Питер
    так, давай разбираться. что я не совсем понимаю, что именно тебе нужно.

    почему есть оговорка - если не с моего хоста.

    ----

    что делает мой код -

    проверяется является ли путь каталогом
    проверяется является ли путь файлом

    если условия выше ложны, то все запросы валятся на index.php.

    я правильно понимаю, что такой вариант тебя не устраивает ? если не устраивается, сорри, я неверно понял, что именно тебе нужно.

    --
    ps. Олег, не сказал, бы что это проще :) Впрочем - каждому свое )