вопросы ЧПУ, Mod_rewrite, Htaccess

  • Автор темы Kauperwood
  • Дата начала
K

Kauperwood

Хелло! Возникли проблемы с написанием ЧПУ, а точнее непонятки. у меня убунта, в файле /etc/apache2/sites-available/default стоят AllowOverride All.
Непонятка1: Лезу создавать .htaccess в корневой папке, создаю, а он исчезает (даже через ls в терминале не видно), создаю новый файл .htaccess в другой папке(в той же не дает создать) копирую в ту же папку - предлагает заменить! Он работает но его вообще не видно, неудобно его редактировать однако. :mellow:
Непонятка2: У меня к index.php подключен callbacks.php в котором через свич инклудяться html статьи. Строка выглядит "www.site.net/index.php?action=servise", хочу естественно "www.site.net/servise". Читал как делать ЧПУ, народ предлагает делать через .htaccess в несколько строчек, запустил phpinfo() - mod_rewrite в модулях есть. Дальше не все понятно, пробую, не выходит, подвис на этой теме, спасибо что читаете этот пост. Движка у меня нет, проблема сто раз уже решалась наверно, но все же, как написать правильно в .htaccess? За правильный ответ репу качну 100%. Подскажи добрый человек.
 
1

1ive

В .htaccess написать:

PHP:
RewriteEngine on # включает mod_rewrite
RewriteRule ^([-a-zA-Z0-9_]+)/? index.php?action=$1 [L]

И тогда www.site.net/servise будет работать как www.site.net/index.php?action=servise
 
K

Kauperwood

Верно, но он почему то дает мне 500 Internal Server Error.
С чем ето может быть связано?
 
1

1ive

Можно полностью содержание .htaccess сюда?
 
K

Kauperwood

эти 2 строчки и все, кроме них ничего больше не добавлял.
 
1

1ive

Есть еще один способ, но тут придется указывать домен (не всегда удобно, если доменов несколько)

PHP:
RewriteEngine on #можно попробовать не писать, если по умолчанию включено.
RewriteCond %{REQUEST_URI} ^/([-a-zA-Z0-9_]+)$
RewriteRule .* http://site.ru/?action=%1 [R=301,L]
 
K

Kauperwood

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

У меня вот такой нубский код обрабатывает метатеги, и если я не укажу какой то либо запрос "action" в этом файле, сервер мне возвращает только одну страницу, почему то статью про автора (.htaccess та же ситуация, - дает одну страницу ) :
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">titles.php</div></div><div class="sp-body"><div class="sp-content">
PHP:
$names = ($_GET['action']);
if ($names == ($_GET['action']="")) {$t = "Морда"; $m="Лицо";$k="что я хочу тут видеть.";$r="index,follow";}
elseif ($names == ($_GET['action']="hosting")) { $t = "Хостинг"; $m="хостинг"; $k="хосты";$r="index,follow";}
elseif ($names == ($_GET['action']="sevenways")){ $t = "Способы похудеть";$m="Кто хочет тот худеет."; $k="кушайте ягоды.";$r="index,follow";}
//// обычные страницы
elseif ($names == ($_GET['action']="about_grub2")){$noparams = "тут пусто";$r="noindex,nofollow";}
elseif ($names == ($_GET['action']="about_partitions")){$noparams = "тут пусто";$r="noindex,nofollow";}
elseif ($names == ($_GET['action']="kontakts")){$noparams = "тут пусто";$r="noindex,nofollow";}
//// страницы что обрабатываються через js

подключаемый файл такой:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">callbacks.php</div></div><div class="sp-body"><div class="sp-content">
PHP:
switch($_GET['action']){
////...
case 'about_autor':
include('content/active/about_autor.html');
break;

default: 
include('content/all/the_morda.html');
break;
if (isset($_GET['action'])){
$to = $_GET['action'];
if (strpbrk($to, '.?/:*<>')) die('символы ., ?, /, :, *, <, > в запросе запрещены');
}
}

Получаеться что .htacces сработал, но тогда получаеться перестает работать система с метатегами и возвращает 1 страницу (первое что пришло в голову).
Может быть бок в этом?
 
1

1ive

Тоесть
www.site.ru/hosting (www.site.net/index.php?action=hosting)
www.site.ru/sevenways (www.site.net/index.php?action=sevenways)
и т.д. - отправляют на
www.site.ru/kontakts (www.site.net/index.php?action=kontakts)
??
 
K

Kauperwood

просто возвращает одну и ту же страницу куда бы я не нажимал (это наверно потому что перестает работать скрипт с мета-тегами)
 
K

Kauperwood

Вроде разобрался. Забыли одну строчку!
PHP:
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*)\.htm$ /index.php?action=$1
решение увидел через генератор

таким способом получаться ссылки вида : "www.site.net/page.htm"


ps. теперь самой вершиной было бы еще избавиться от росширения .htm :mellow:

мысли вслух: вот не пойму почему если убираю ".htm" ставлю "/" или вообще ничего не ставлю - тогда у меня падает ксс))
мысли вслух 2: хм.. роботы наверно тоже проходят через .htacces, наверно им пофиг))
 
K

Kauperwood

как на локалхосте пользоваться?
 
1

1ive

"избавиться от росширения .htm"
Просто убрать .htm и ссылки на ксс (и на все остальное типа js) сделать относительно корня сайта ("/styles/style.css")
 
V

vital

RewriteEngine on # включает mod_rewrite
RewriteRule ^([-a-zA-Z0-9_]+)/? index.php?action=$1 [L]

вот это выдает ошибку пицот потому что регулярка должна быть такая
RewriteRule ^([-a-zA-Z0-9_]+)$ index.php?action=$1 [L]
если на то пошло..

Дальше топик не читал.
 
K

Kauperwood

вот на досуге вопросик появился, вобщем в папке сайта лежит файлик текстовый в котором служебная информация не для глаз так скзать.
Так вот переименовать файл и закрыть доступ в папку без проблем через .htaccess. А допустим если имя файла известно, он легко открываеться не смотря на закрытый доступ к самой папке.
Пробовал для файла
Код:
<Files *.txt>
Deny from all 
</Files>
и еще несколько вариантов, но не дают они ничего, файл открываеться если знать его имя.
Вопрос как запретить через .htaccess открывать файл, или эта задача другим путем решается?
 
K

Kauperwood

все расчехлился, надо менять расширение txt.
Почему? потому как сказал один господин : .txt файлы кеширует акселератор статического содержимого сайта,
Интересная фраза однако)
 
V

vital

как все сложно. Да поставить просто расширение php файлу. Или, если принуипиально - запаролить директорию. Как поставить пароль на папку описано в гугле.
 
K

Kauperwood

так и сделал, поменял на php, - единственное так это то что если его в браузере открыть, на новую строку не переводит, все в ряд пока экран не заполниться.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!