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 :: mod_rewrite: файл сделать папкой

 PHP.SU

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


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

> Без описания
Yuriy
Отправлено: 05 Февраля, 2010 - 01:20:57
Post Id



Частый гость


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


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




Всем привет!

Очень редко приходится обращаться за помощью, обычно поковыряю, пусть 4 часа, но сам и всё получится. А тут просто мозг уже сломал.

Задача проста.

Допустим, есть файл http://site[dot]ru/file.php

Я хочу, чтобы он был доступен по адресу http://site[dot]ru/file и http://site.ru/file/, что будет подобно вызову index.php из какой-то папки. Казалось бы, всё просто:

CODE (htmlphp):
скопировать код в буфер обмена
  1. RewriteEngine on
  2. RewriteRule ^(.*)$ $1.php


Сервер возвращает 500 ошибку Internal Server Error. Узнал, что это говорит об ошибке в синтаксисе .htaccess. Сижу и думаю, каково, собственно? Я понимаю вышенаписанный код так:

Вызываю http://site.ru/file. Берётся правая часть после / - то есть file. Под регулярку она подходит. Подставляется в шаблон замены - file.php и сервер обратится к этому файлу.

Что я намудрил? Улыбка

(Добавление)

Что самое интересное, при таком раскладе

CODE (htmlphp):
скопировать код в буфер обмена
  1. RewriteEngine on
  2. RewriteRule ^(.*)/$ $1.html


файл http://site[dot]ru/file/ сервер кушает, а http://site[dot]ru/file уже нет. Ну оно и понятно - регулярке не соответствует. Но почему без слэша уже ошибка? Огорчение

(Отредактировано автором: 05 Февраля, 2010 - 01:34:47)



-----
Yuriy
 
 Top
JustUserR
Отправлено: 05 Февраля, 2010 - 03:05:42
Post Id



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


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


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




Yuriy пишет:
Что будет подобно вызову index.php из какой-то папки. Казалось бы, всё просто
Судя по вашему коду вы вызываете не index.php с соответствующим параметром указывающий на идентификатор страницы а просто добавляете расширения php к запрошенному ресурсу Вероятно стоит заменить шаблон на подобный такому RewriteRule ^(.*)/$ index.php?page=$1 и добавить условие RewriteCond чтобы сам index.php не трогало


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Ch_chov
Отправлено: 05 Февраля, 2010 - 06:31:35
Post Id



Постоянный участник


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


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




CODE (htmlphp):
скопировать код в буфер обмена
  1. <IfModule mod_rewrite.c>
  2.   RewriteEngine on
  3.  
  4.   RewriteCond %{REQUEST_FILENAME} !.php$
  5.   RewriteCond %{REQUEST_FILENAME} !-f
  6.   RewriteCond %{REQUEST_FILENAME} !-d
  7.   RewriteRule ^([^/]*)/?$ $1.php [L]
  8.  
  9. </IfModule>

(Отредактировано автором: 05 Февраля, 2010 - 06:34:18)

 
 Top
Yuriy
Отправлено: 05 Февраля, 2010 - 09:45:58
Post Id



Частый гость


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


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




JustUserR пишет:
Судя по вашему коду вы вызываете не index.php с соответствующим параметром указывающий на идентификатор страницы а просто добавляете расширения php к запрошенному ресурсу


Ну в общем-то да. Если ввести site.ru/file, site.ru/file1/ сервер должен обратиться к файлам file.php и file1.php.

Ch_chov, спасибо! То что нужно Улыбка


-----
Yuriy
 
 Top
Yuriy
Отправлено: 05 Февраля, 2010 - 13:53:50
Post Id



Частый гость


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


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




И ещё вопрос, связанный с предыдущим. Вот я из файлов сделал "папки". Теперь я хочу, чтобы пользователь не умничал и не смог вызвать в браузере файл вот так:

site.ru/file.php, а только так: site.ru/file

Сейчас же эти оба варианта равнозначны и рабочие.

Просто как бы скрыть факт, что я пользуюсь php Улыбка Я этого не стыжусь, не переживайте Улыбка Просто хочу так сделать.

Вот такую конструкцию пробовал влепить:

CODE (htmlphp):
скопировать код в буфер обмена
  1. RewriteCond %{REQUEST_FILENAME} .php$
  2. RewriteRule .* - [R=404,L]


но если вызвать site.ru/file, то сервер выдаст 404 ошибку... Скушает правило, написанное мною выше. А как же сделать, чтобы работало правило, которое я изначально затронул в теме (код, который подсказал Ch_chov), и вот это?

Подскажите, пожалуйста, как быть Улыбка

(Отредактировано автором: 05 Февраля, 2010 - 13:56:26)



-----
Yuriy
 
 Top
Ch_chov
Отправлено: 05 Февраля, 2010 - 18:43:16
Post Id



Постоянный участник


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


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




Попробуй так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. ErrorDocument 404 /error404.php
  2. <IfModule mod_rewrite.c>
  3.   RewriteEngine on
  4.  
  5.   RewriteCond %{ENV:REDIRECT_END} !^$
  6.   RewriteRule ^ - [L]
  7.  
  8.   RewriteCond %{REQUEST_FILENAME} \.php$
  9.   RewriteRule ^.*$ error404.php [E=END:1,L]
  10.  
  11.   RewriteCond %{REQUEST_FILENAME} !\.php$
  12.   RewriteCond %{REQUEST_FILENAME} !-f
  13.   RewriteCond %{REQUEST_FILENAME} !-d
  14.   RewriteRule ^([^/]*)/?$ $1.php [E=END:1,L]
  15.  
  16. </IfModule>

В error404.php не забудь отправлять заголовок header("HTTP/1.0 404 Not Found");


Или можно в каждом php скрипте проверять $_SERVER['QUERY_STRING'] выдавать ошибку 404 если там присутствует '.php'


А еще лучше сделать одну точку входа для всех запросов.
CODE (htmlphp):
скопировать код в буфер обмена
  1.   RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Потом обрабатывать их с помощью php и подключать соответствующие файлы.
 
 Top
krutovaniya
Отправлено: 05 Февраля, 2010 - 19:39:54
Post Id



Новичок


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


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




Я точно не помню, но помоему так: (поправьте, если что)

file1.php
CODE (php):
скопировать код в буфер обмена
  1. <?php
  2. if ($_SERVER["REQUEST_URI"] == "file1.php") {   // Возможно, что "/file1.php"
  3.    // Нет такого файла :)
  4. } else {
  5.    // Есть такой файл
  6. }
  7. ?>


P.S. На сколько я помню, где-то в php.ini есть параметр, и дано описание типа:
Цитата:
Сообщать браузеру, что используется PHP: Включено

(Отредактировано автором: 05 Февраля, 2010 - 19:41:50)

 
 Top
Yuriy
Отправлено: 05 Февраля, 2010 - 22:21:03
Post Id



Частый гость


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


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




Ch_chov пишет:
Попробуй так:


Попробовал. Если зайти на главную страницу сайта - будет 404.

Ch_chov пишет:
Или можно в каждом php скрипте проверять $_SERVER['QUERY_STRING'] выдавать ошибку 404 если там присутствует '.php'


А ведь действительно... По сути, код из .htaccess делает тоже самое, только ещё и зря гонится бедный Apache. Наверное, лучше так и поступлю!

Всем спасибо!!!


-----
Yuriy
 
 Top
JustUserR
Отправлено: 06 Февраля, 2010 - 02:02:44
Post Id



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


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


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




Yuriy пишет:
Просто как бы скрыть факт, что я пользуюсь php
На самом деле это можно сделать без всякого модуля mod_rewrite - в таком случае решение будет зависить от того работает ли у вас PHP в виде обработки файлов с определенным MIME-типом или в виде CGI-скрипта (НЕ путать с установкой самого PHP в виде CGI Улыбка
К примеру можно воспользоваться модулем mime_magic и определить PHP файлы за счет тега <?php или заранее оговоренной строки в самом начале файла В общем же случае можно установить MIME-типа application/x-httpd-php по умолчанию для всех файлов или файлов с именами по определенному шаблону в каталоге и тогда расширения .php будет не нужно
Для обычных CGI-скритпов есть похожая схема их запуска без определение определенного расширения или специальной папки для них


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Yuriy
Отправлено: 06 Февраля, 2010 - 14:54:40
Post Id



Частый гость


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


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




JustUserR пишет:
В общем же случае можно установить MIME-типа application/x-httpd-php по умолчанию для всех файлов или файлов с именами по определенному шаблону в каталоге и тогда расширения .php будет не нужно


Я так изначально сделал и мои php файлы имели расширение html. Но понял, зачем извращаться и всё сделал по известной схеме, которую я уже в этой теме и описал Улыбка

Спасибо за советы, в будущем наверняка мне эта информация пригодится!

(Отредактировано автором: 06 Февраля, 2010 - 14:55:13)



-----
Yuriy
 
 Top
JustUserR
Отправлено: 07 Февраля, 2010 - 00:59:38
Post Id



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


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


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




Yuriy пишет:
Спасибо за советы, в будущем наверняка мне эта информация пригодится!
Пожалуйста! Лично мне кажется что данный способ является более удобным - ведь mod_rewrite только скрывает адреса а данный подход позволяет реально запускать файлы с различным MIME-типом соответствующим образом без указания расширений файлов


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Yuriy
Отправлено: 07 Февраля, 2010 - 01:13:55
Post Id



Частый гость


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


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




Ну хорошо. Только как мне с этим работать? Улыбка


-----
Yuriy
 
 Top
JustUserR
Отправлено: 07 Февраля, 2010 - 03:29:25
Post Id



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


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


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




Yuriy пишет:
Ну хорошо. Только как мне с этим работать? Улыбка
В смысле как работать - если вы про настройку то необходимые параметры легко устанавливаются через .htaccess - а в остальном файлы без расширений полностью эквивалентны с расширениями (При этом они могут идентифицироваться по какому-то шаблону Улыбка - а что касается CGI-скриптов то там все по-прежнему


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Yuriy
Отправлено: 07 Февраля, 2010 - 12:59:50
Post Id



Частый гость


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


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




JustUserR пишет:
то необходимые параметры легко устанавливаются через .htaccess


Да, меня это интересует. Можно попросить пример? Улыбка


-----
Yuriy
 
 Top
JustUserR
Отправлено: 07 Февраля, 2010 - 14:44:53
Post Id



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


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


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




Yuriy пишет:
Да, меня это интересует. Можно попросить пример? Улыбка
Можно Улыбка
Таким образом устанавливается обработка PHP для всех файлов в данной директории где лежит .htaccess - вместо * можно задать шаблон имени файлов
CODE (htmlphp):
скопировать код в буфер обмена
  1. <Files *>
  2. DefaultType application/x-httpd-php
  3. SetHanlder application/x-httpd-php
  4. </Files>
Для CGI используется похожая схема но чуть посложнее из-за возможного Allowoverride none для запуска CGI-скриптов
CODE (htmlphp):
скопировать код в буфер обмена
  1. Options +ExecCGI
  2. <Files *>
  3. Options +ExecCGI
  4. DefaultType cgi-script
  5. SetHanlder cgi-script
  6. </Files>
И конечно же в случае CGI-скриптов не забывать про права доступа


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Apache и другие веб-серверы »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB