За последние 24 часа нас посетили 22984 программиста и 1230 роботов. Сейчас ищут 780 программистов ...

Как делать красивые URL без mod_rewrite

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

  1. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Решил запостить статью о том как делать красивые URL без mod_rewrite.

    > Что это такое <

    Идеальный способ сделать это через mod_rewrite.

    Но иногда, не возможно использовать mod_rewrite.

    Некоторые делают это так:
    http://example.com/?p=link

    Есть более гуманный способ:
    http://example.com/page.php/link


    можно еще сократить:
    .htaccess
    Код (Text):
    1. AddType application/x-httpd-php .page
    файл php скрипта - .page

    URL:
    http://example.com/.page/link

    Возможно, есть способ избавиться от точки, постите.
     
  2. Anonymous

    Anonymous Guest

    Есть. В Апаче есть такая штука, ForceType называется. Она core feature. - Минус - не работает при PHP как CGI... что встречается к счастью, уже редко.
    Код (Text):
    1. Action throw /index.php
    2.  
    3. <FilesMatch "^([^.]+)$">
    4. ForceType throw
    5. </FilesMatch>
    6.  
    7. <FilesMatch index.php>
    8. ForceType application/x-httpd-php
    9. </FilesMatch>
    Тут хорошо написано - http://spectator.ru/technology/php/user_friendly_urls

    PS: как раз делаю, почти без mod_rewrite... вот прям счас =))
     
  3. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    итого:
    файл .htaccess
    Код (Text):
    1. <FilesMatch page>
    2.    ForceType application/x-httpd-php
    3. </FilesMatch>
    файл page
    PHP:
    1. <dl>
    2.     <dt>BASE DIR</dt><dd><?=dirname($_SERVER['SCRIPT_NAME'])?></dd>
    3.     <dt>URI</dt><dd><?=$_SERVER['REQUEST_URI']?></dd>
    4. </dl>
    URL:
    http://example.com/page/link
     
  4. Anonymous

    Anonymous Guest

    Ti, тож вариант... просто у меня не обязательно page - у меня это как правило, имя модуля для обработки... поэтому я редиректю все в индекс, кром файлов, иначе картинки и css прийдется тоже скриптом отдавать....
     
  5. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Код (Text):
    1. <FilesMatch ^page|link|forum|chat$>
    2.    ForceType application/x-httpd-php
    3. </FilesMatch>
     
  6. Anonymous

    Anonymous Guest

    Ti, я стремлюсь минимизрировать логику, ложащуюся на mod_rewrite или ForceType - т.е, получит максимальноу управление программно,
    я могу так добавлять программно новые модули.
     
  7. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    да, я тоже
    собственно все правило у меня выглядит так:
    Код (Text):
    1.  
    2. RewriteCond %{REQUEST_FILENAME} !-f
    3. RewriteCond %{REQUEST_FILENAME} !-d
    4. RewriteRule . index.php [L,QSA]
     
  8. NIKO

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

    С нами с:
    10 фев 2006
    Сообщения:
    655
    Симпатии:
    0
    Адрес:
    Armenia
    А зачем это все?
     
  9. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    NIKO
    см ссылки в теме
     
  10. Anonymous

    Anonymous Guest

    Ti
    Код (Text):
    1. RewriteRule ^([^.]+)$ index.php
    =)
     
  11. NIKO

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

    С нами с:
    10 фев 2006
    Сообщения:
    655
    Симпатии:
    0
    Адрес:
    Armenia
    допустим вы сделаете очень красивые ссылки...но они же будут работать только у вас, а не везде(в инете)...
     
  12. Anonymous

    Anonymous Guest

    Угадай, почему мы их делаем? =)
    Именно потому, что они будут работать в инете.
    Главное - что они не просто "красивые", а очень-очень хорошо индексируемые поисковиками...
     
  13. NIKO

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

    С нами с:
    10 фев 2006
    Сообщения:
    655
    Симпатии:
    0
    Адрес:
    Armenia
    Вы попросите Apache сделать это ? :)
     
  14. Anonymous

    Anonymous Guest

  15. NIKO

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

    С нами с:
    10 фев 2006
    Сообщения:
    655
    Симпатии:
    0
    Адрес:
    Armenia
  16. svk

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

    С нами с:
    7 авг 2006
    Сообщения:
    506
    Симпатии:
    0
    Адрес:
    NetByNet
    а я предпочитаю ставить свой обработчик ошибки 404, который выводит Header 200 OK, анализирует строку запроса и соответственно выдает что надо :p
     
  17. Anonymous

    Anonymous Guest

    svk, есть минусы. Апач напрягается с 404 ошибки, если ведет логи. Это раз. Это не спасает от просмотра реальных каталогов, это два. Это медленней, это три. А самое главное, это занимает собсно 404 обработчик, которым я пользуюсь по назначению для файлов.
     
  18. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    не работает POST
     
  19. Anonymous

    Anonymous Guest

    Ti, в смысле, "красиво" не работает? =) Тогда, да =)
     
  20. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    вообще POST не работает
     
  21. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Горбунов Олег, похоже ты забыл заэкранировать точку ;)

    Собственно моя лепешка в общую кучку :)
    Код (Text):
    1.  
    2. RewriteRule !\.(gif|ico|html|html|css|jpg|zip|rar|doc|js|swf|mp3|mpg|php)$ index.php
     
  22. Anonymous

    Anonymous Guest

    Не-а. Точка не является метасимволом для символьного класса, поэтому внутри квадратных скобок - не экранируется. ;)
     
  23. Ti

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

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

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

    явно указывает: не существующий файл или папка

    uri могут быть 14.10.2006; или 20.gif, которое при отсутствии динамически создается
     
  24. Anonymous

    Anonymous Guest

    Ti, просто у меня есть вариант, когда есть физическая папка с таковым же именем, но это не та же самая, что и виртуальная...
     
  25. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург