Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как бы движок, но дико втыкает

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Описание: Конкурс с призовым фондом 10$
ok
Отправлено: 13 Августа, 2011 - 22:51:35
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Всем привет!
Объявлен конкурс! Победителю - 10$. Хочу, чтобы помогли причесать вот это жалкое подобие скрипта движка:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. if( $_SERVER['HTTP_HOST'] == 'www.site.ru' ) {
  3. header("HTTP/1.1 301 Moved Permanently");
  4. header("Location: http://site.ru" . $_SERVER['REQUEST_URI']); }
  5. if ($_SERVER['REQUEST_URI'] == "/") include "data/index.php";
  6. elseif ($_SERVER['REQUEST_URI'] == "/about.html") include "data/about.php";
  7. elseif ($_SERVER['REQUEST_URI'] == "/contacts.html") include "data/contacts.php";
  8. elseif ($_SERVER['REQUEST_URI'] == "/office.html") include "data/office.php";
  9. elseif ($_SERVER['REQUEST_URI'] == "/services.html") include "data/services.php";
  10. elseif ($_SERVER['REQUEST_URI'] == "/articles/") include "data/articles/index.php";
  11. elseif ($_SERVER['REQUEST_URI'] == "/articles/horosho.html") include "data/articles/horosho.php";
  12. elseif ($_SERVER['REQUEST_URI'] == "/articles/ploho.html") include "data/articles/ploho.php";
  13. elseif ($_SERVER['REQUEST_URI'] == "/articles/gluho.html") include "data/articles/gluho.php";
  14. elseif ($_SERVER['REQUEST_URI'] == "/articles/glupo.html") include "data/articles/glupo.php";
  15. else { header("HTTP/1.0 404 Not Found"); include "errors/404.php"; }
  16. include "templates/template.php";
  17. ?>

В шаблоне - переменные (теги, контент), в файлах .php им присвоено значение.

И .htaccess к нему:

CODE (htmlphp):
скопировать код в буфер обмена
  1. Options -Indexes +FollowSymLinks
  2.  
  3. RewriteEngine On
  4. RewriteBase /
  5.  
  6. RewriteRule ^\.htaccess$ - [F]
  7.  
  8. RewriteCond %{REQUEST_FILENAME} !-f
  9. RewriteCond %{REQUEST_FILENAME} !-d
  10. RewriteRule ^(.*)$ index.php?_REQUEST=$1 [L]


Все работает, но примитив напрягает. Это как землю вскапывать голыми руками.
Искал долго, читал много. Ничего не нарыл. В итоге написал это.
Помогите пожалуйста! Лаконизм кода приветствуется.

ЗЫ. Готов до первого поста с решением внести объявленный призовой фонд (10$) в залог авторитету форума и прогеру в законе, он и рассудит, и присудит, и переведет приз победителю.
 
 Top
OrmaJever
Отправлено: 13 Августа, 2011 - 23:03:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




как вариант
PHP:
скопировать код в буфер обмена
  1. if( $_SERVER['HTTP_HOST'] == 'www.site.ru' ) {
  2. header("HTTP/1.1 301 Moved Permanently");
  3. header("Location: http://site.ru" . $_SERVER['REQUEST_URI']); }
  4. $path =  array('/' => 'data/index.php', '/about.html' => 'data/about.php',
  5.                                         '/contacts.html' => 'data/contacts.php', '/office.html' => 'data/office.php',
  6.                                         '/services.html' => 'data/services.php', '/articles/' => 'data/articles/index.php',
  7.                                         '/articles/horosho.html' => 'data/articles/horosho.php', '/articles/ploho.html' => 'data/articles/ploho.php',
  8.                                         '/articles/gluho.html' => 'data/articles/gluho.php');
  9. if(isset($path[$_SERVER['REQUEST_URI']])) include($path[$_SERVER['REQUEST_URI']]);
  10. else { header("HTTP/1.0 404 Not Found"); include "errors/404.php"; }
  11. include "templates/template.php";


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
ok
Отправлено: 13 Августа, 2011 - 23:10:39
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




OrmaJever
Спасибо, уже лучше. Хочу еще короче.

(Отредактировано автором: 13 Августа, 2011 - 23:12:23)

 
 Top
biperch
Отправлено: 13 Августа, 2011 - 23:29:03
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


Помог: 8 раз(а)




OrmaJever пишет:
$path = array('/' => 'data/index.php', '/about.html' => 'data/about.php',
'/contacts.html' => 'data/contacts.php', '/office.html' => 'data/office.php',
'/services.html' => 'data/services.php', '/articles/' => 'data/articles/index.php',
'/articles/horosho.html' => 'data/articles/horosho.php', '/articles/ploho.html' => 'data/articles/ploho.php',
'/articles/gluho.html' => 'data/articles/gluho.php');



Это можно не укоротить а вынести в отдельный файл и будет компактно
 
 Top
White
Отправлено: 13 Августа, 2011 - 23:30:38
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




PHP:
скопировать код в буфер обмена
  1. $uri=$_SERVER['REQUEST_URI'];
  2. if($_SERVER['HTTP_HOST'] == 'www.site.ru' ) {
  3.         header("HTTP/1.1 301 Moved Permanently");
  4.         header("Location: http://site.ru".$uri);
  5. }
  6. $pages=array("/", "/about.html", "/contacts.html", "/office.html", "/services.html", "/articles/", "/articles/horosho.html", "/articles/ploho.html", "/articles/gluho.html", "/articles/glupo.html");
  7. if (in_array($uri, $pages)) {
  8.         if(substr($uri, strlen($uri)-1)=='/') include "data".$uri."index.php";
  9.         else include "data".substr($uri, 0, strlen($uri)-4)."php";
  10. } else {
  11.         header("HTTP/1.0 404 Not Found");
  12.         include "errors/404.php";
  13. }
  14. include "templates/template.php";


-----
if(time()>1356048000) die();
 
 Top
ok
Отправлено: 13 Августа, 2011 - 23:36:40
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




White
Спасибо, круче. И работает как будто быстрее. Еще варианты пожалуйста!
(Добавление)
А почему сервер ругается? :
[Sun Aug 14 01:15:41 2011] [error] [client 46.61.1.7] ALERT - tried to register forbidden variable '_REQUEST' through GET variables (attacker '46.61.1.7', file '/usr/home/...../site.ru/html/index.php'), referer: http://site.ru/contacts.html

(Отредактировано автором: 14 Августа, 2011 - 00:03:06)

 
 Top
tsoi85
Отправлено: 14 Августа, 2011 - 03:00:05
Post Id


Новичок


Покинул форум
Сообщений всего: 63
Дата рег-ции: Июнь 2011  


Помог: 10 раз(а)




index.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $url = (preg_match("/^([-_a-zA-Z0-9\/\.]+)(\.html|\/)$/", $_SERVER['REQUEST_URI'])?str_replace('..', '', $_SERVER['REQUEST_URI']):'');
  3. if($_SERVER['HTTP_HOST'] == 'www.my-site.ru') {
  4.   header("HTTP/1.1 301 Moved Permanently");
  5.   header("Location: http://my-site.ru".$_SERVER['REQUEST_URI']);
  6.   exit;
  7. }
  8. $incfile = "data";
  9. if($_SERVER['REQUEST_URI']=='/') {
  10.     $incfile .= "/index.";
  11. } elseif (!empty($url) && substr($url, strlen($url)-1)=='/') {
  12.     $incfile .= $url."index.";
  13. } else {
  14.     $incfile .= substr($url, 0, strlen($url)-4);
  15. }
  16. $incfile .= "php";
  17. $incl = (basename($_SERVER['REQUEST_URI']) != 'index.html')?1:0;
  18. if ($incl && file_exists($incfile)) {
  19.     include($incfile);
  20. } else {
  21.         header("HTTP/1.0 404 Not Found");
  22.     header('HTTP/1.1 404 Not Found');
  23.     header('Status: 404 Not Found');
  24.     include("errors/404.php");
  25. }
  26. include("templates/template.php");
  27. ?>



.htaccess
CODE (html):
скопировать код в буфер обмена
  1. Options -Indexes +FollowSymLinks
  2. RewriteEngine On
  3. RewriteBase /
  4. RewriteRule ^\.htaccess$ - [F]
  5. RewriteCond %{REQUEST_FILENAME} !-f
  6. RewriteCond %{REQUEST_FILENAME} !-d
  7. RewriteRule ^(.*)$ index.php?r=$1 [L]

(Отредактировано автором: 14 Августа, 2011 - 16:28:55)

 
 Top
DeepVarvar Супермодератор
Отправлено: 14 Августа, 2011 - 07:17:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




ok пишет:
Лаконизм кода приветствуется

PHP:
скопировать код в буфер обмена
  1. $redirect = array(
  2.  
  3.   // add more as: "old url" => "new url",
  4.  
  5.   "/" => "data/index.php",
  6.   "/about.html" => "data/about.php",
  7.   "/contacts.html" => "data/contacts.php",
  8.   "/office.html" => "data/office.php",
  9.  
  10.   );
  11.  
  12. $key = $_SERVER['REQUEST_URI'];
  13.  
  14. if ($_SERVER['HTTP_HOST'] == 'www.site.ru') {
  15.   header("HTTP/1.1 301 Moved Permanently");
  16.   header("Location: http://site.ru".$key);
  17.   die();
  18.   }
  19.  
  20. if (isset($redirect[$key]))
  21.   require_once($redirect[$key]);
  22.  
  23. else {
  24.   header("HTTP/1.0 404 Not Found");
  25.   require_once("errors/404.php");
  26.   }
  27.  
  28. require_once("templates/template.php");

А вообще все эти выкрутасы можно сделать в одном .htaccess
Интересует?

(Отредактировано автором: 14 Августа, 2011 - 07:20:22)

 
 Top
White
Отправлено: 14 Августа, 2011 - 09:38:43
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




ok пишет:
А почему сервер ругается

видимо его здесь что-то не устраивает:
CODE (htmlphp):
скопировать код в буфер обмена
  1. RewriteRule ^(.*)$ index.php?_REQUEST=$1 [L]

DeepVarvar пишет:
А вообще все эти выкрутасы можно сделать в одном .htaccess

для вас было бы пожалуй наиболее правильным решением


-----
if(time()>1356048000) die();
 
 Top
ok
Отправлено: 14 Августа, 2011 - 09:39:33
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




tsoi85
Замечательно! Это настоящий движок! Нет двойной проверки: 1) наличия урла (проверяет движок в массиве, а если на сайте не 8, а 8000 страниц?); 2) наличия файла в каталоге /data/.... (проверяет апач и делает это неизбежно). Следовательно, первую проверку (движком) надо убрать, что блестяще проделал tsoi85. Движок работает почти также быстро, как и реально лежащие файлы с инклудящимся шаблоном. В случае с массивом урлов все работало заметно медленнее.
Но появились новые траблы:
1) не выводится 404. Понятно, что это должен делать апач через ErrorDocument. Я пробовал добавлять в .htaccess эту директиву в двух вариантах: ErrorDocument 404 /errors/404.php и ErrorDocument 404 /data/errors/404.php . Не работает, браузер Firefoks показывает пустую страницу с пустым source. Пробовал в движке комментить последние строки, тоже не помогает:
CODE (htmlphp):
скопировать код в буфер обмена
  1. /* else {
  2.     header("HTTP/1.0 404 Not Found");
  3.     include("errors/404.php");
  4. }*/
;
2) выводятся урлы: /index.html ; /index.php ; /articles/index.html ; что недопустимо (дублирование контента). Очень желательно по ним получать 404, на худой конец - 301.
Как сделать не знаю.
(Добавление)
White пишет:
DeepVarvar пишет:
А вообще все эти выкрутасы можно сделать в одном .htaccess

для вас было бы пожалуй наиболее правильным решением

Уважаемые White и DeepVarvar! Оромное спасибо за участие и желание помочь. Решение сделать все через .htaccess лежит на поверхности и не является оптимальным. Озвучиваю МОТИВЫ написания движка:

1. Возможность один раз в одном месте инклудить шаблон. В варианте реально лежащих по запрашиваемому пути файлов .php с рерайтом на .html нужно было в каждом файле прописывать путь к шаблону (include "templates/template.php"; или "../templates/template.php" и т.д.);

2. Возможность получать 200 только по тем урлам, которые есть в Sitemap.xml. По всем остальным мой первоначальный вариант движка и все здесь предложенные варианты с массивом урлов отдают 404, например по /index.php, /index.html, и это ЗДОРОВО. В случае реальных урлов (.*)/index.html приходилость редиректить 301 на (.*)/, а вот при запросе урлов с .php на конце, он их выводил как зайчик с ответом 200 и с этим, наверное, ничего сделать нельзя. Яндекс ест их регулярно, не смотря на запрет в роботсе, и держит не в индексе, но в загашнике, что неприятно, чувствуешь какую-то беспомощность перед этим монстром;

3. Возможность в дальнейшем легче перейти на php + mysql.

4. Наличие движка как такового повышает социальный статус: был безлошадный, голь перекатная, а теперь - верхом на движке о четырех копытах, зажиточный ! Радость Ха-ха Ха-ха Радость

(Отредактировано автором: 14 Августа, 2011 - 10:47:19)

 
 Top
White
Отправлено: 14 Августа, 2011 - 10:38:01
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)





tsoi85 все продумал Радость
а если мы так Подмигивание :
http://site[dot]ru/[dot][dot][dot]/[dot][dot][dot]//errors/404[dot]html
ok не заморачивайтесь по поводу вышенаписанного


-----
if(time()>1356048000) die();
 
 Top
ok
Отправлено: 14 Августа, 2011 - 10:52:55
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




White пишет:
tsoi85 все продумал Радость
а если мы так Подмигивание :
http://site[dot]ru/[dot][dot][dot]/[dot][dot][dot]//errors/404[dot]html
ok не заморачивайтесь по поводу вышенаписанного

В папку /errors/ я тупо положу .htaccess (deny from all) и умный юмор станет неуместен Закатив глазки
 
 Top
tsoi85
Отправлено: 14 Августа, 2011 - 11:04:40
Post Id


Новичок


Покинул форум
Сообщений всего: 63
Дата рег-ции: Июнь 2011  


Помог: 10 раз(а)




White, спасибо.
Недосмотрел. Убираем слеш.


ok пишет:
В папку /errors/ я тупо положу .htaccess (deny from all)

Не выход, т.к. можно и ещё на папку выше вылезти.
 
 Top
White
Отправлено: 14 Августа, 2011 - 11:05:24
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




ok положите. только вы забыли одно но. запрашивать этот файл будет не клиент через браузер, а ваш index.php через include.
P.S. я же сказал, не заморачивайтесь. вероятность того что кто-либо не знакомый с исходниками вашего скрипта и структурой сайта попробует сделать что-либо подобное стремится к почти абсолютному нолю Подмигивание
(Добавление)
tsoi85 да, так должно сработать.


-----
if(time()>1356048000) die();
 
 Top
ok
Отправлено: 14 Августа, 2011 - 11:13:08
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




tsoi85
Исправил, 404 все равно не отдается.
Случайно, забыв переключить раскладку, ввел /contacts.зрз и получил на экран главную страницу. Попробовал: http://site[dot]ru/любаякириллица , выводится содержимое главной страницы.

(Отредактировано автором: 14 Августа, 2011 - 11:26:56)

 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB