Непонятки с .htaccess

Статус
Закрыто для дальнейших ответов.

fantasy4fun

лдж в php
Регистрация
16.08.2009
Сообщения
136
Здрасти всем.
Суть темы в следующем:
имеется файл .htaccess, следующего содержания:

Код:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.wowlol.ru
RewriteRule ^(.*)$ http://wowlol.ru/$1 [R=301,L]
RewriteBase /
RewriteRule ^q/([0-9]+)(/?)$ q.php?id=$1
RewriteRule ^byrating/([0-9]+)(/?)$ byrating.php?p=$1
RewriteRule ^art/([0-9]+)(/?)$ art.php?p=$1
RewriteRule ^bayan/([0-9]+)(/?)$ bayan.php?p=$1
RewriteRule ^comiserials/([0-9]+)(/?)$ comiserials.php?p=$1
RewriteRule ^wowfap/([0-9]+)(/?)$ wowfap.php?p=$1
RewriteRule ^info/([0-9]+)(/?)$ info.php?p=$1
RewriteRule ^date/([0-9]+)(/?)$ index.php?p=$1
RewriteRule ^/$ index.php
RewriteRule ^tag/(.+)/([0-9]+)(/?)$ tag.php?tag=$1&p=$2
RewriteRule ^tag/(.+)(/?)$ tag.php?tag=$1
RewriteRule ^abyss(/?)$ abyss.php
RewriteRule ^tag(/?)$ index.php
RewriteRule ^abysstop(/?)$ abysstop.php
RewriteRule ^random(/?)$ random.php
RewriteRule ^best(/?)$ best.php
RewriteRule ^konkurs(/?)$ konkurs.php
RewriteRule ^help(/?)$ help.php
RewriteRule ^byrating(/?)$ byrating.php
RewriteRule ^date(/?)$ index.php
RewriteRule ^find(/?)$ find.php
RewriteRule ^rss(/?)$ rss.php
RewriteRule ^art(/?)$ art.php
RewriteRule ^bayan(/?)$ bayan.php
RewriteRule ^comiserials(/?)$ comiserials.php
RewriteRule ^wowfap(/?)$ wowfap.php
RewriteRule ^info(/?)$ info.php
RewriteRule ^add(/?)$ add.php
RewriteRule ^faq(/?)$ faq.php
RewriteRule ^advert(/?)$ advert.php
RewriteRule ^webmaster(/?)$ webmaster.php
RewriteRule ^q(/?)$ q.php
RewriteRule ^vote(/?)$ vote.php
RewriteRule ^download(/?)$ download/
php_flag display_errors on
ErrorDocument 404 /404.php
И имеются на сайте категории типа art (радел обоев), comiserials (комиксы - сериалы) и т.п. При этом, некоторые разделы, как допустим art открываются у пользователя как wowlol.ru/art/ а допустим раздел comiserials открывается у пользователя как wowlol.ru/comiserials
Эти разделы внесены в меню навигации и у страницы допустим wowlol.ru/art/ pr=3, а у страницы wowlol.ru/comiserials/ pr=0 (в то время как у страницы wowlol.ru/comiserials pr=3)
в коде этих страниц почти всё одинаково, в меню навигации (меню находится в отдельном файле) тоже всё одинаково.

Отсюда вопрос - почему некоторые разделы открываются без закрывающего слеша в конце, а некоторые с ним ?

Буду признателен за подсказки в какую сторону смотреть что бы найти косяк. Заранее спасибо.
 

blackcot

Well-Known Member
Регистрация
10.09.2009
Сообщения
439
Проблема, скорее всего, в построении ссылки в HTML-коде шаблона или в динамическом скрипте.
.htaccess построен правильно, хотя несколько громоздко и некоторые правила дублируются.
 

fantasy4fun

лдж в php
Регистрация
16.08.2009
Сообщения
136
Что дублируются - знаю, но удалять боюсь т.к. могу удалить не то что нужно. Построение ссылки в HTML-коде шаблона идентично для каждого раздела, вот код щаблона меню:

Код:
<?
	$MENU1 = array(
			"последние" => "/",
			"случайные" => "random",
			"ТОП 50" => "byrating",
			"лучшие" => "best",
			"art/обои" => "art",
			"найти" => "find"
			);
	$MENU2 = array(
			"нерассмотренное" => "abyss",
			"топ нерассмотренного" => "abysstop",
			"баяны" => "bayan",
			"прислать перл" => "add"
			);
	$MENU3 = array(
			"комиксы-сериалы" => "comiserials",
			"всякое с дренейками" => "perehod.php",
			"форум вовлола" => "forum",
			"FAQ" => "faq"
			);
	$MENU4 = array(
			"гильдиям" => "help",
			"кнопка цитатника" => "webmaster",
			"размещение рекламы" => "advert"
			);

	$page = basename($_SERVER['PHP_SELF']);
?>

<ul class="submenu">
	<li>
		<span>Цитаты:</span>
		<ul>
			<? foreach ($MENU1 as $title => $link): ?>
			<?if ($link==$page) {?>
				<li>
					<span><?=$title?></span>
				</li>
			<?} else {?>
				<li>
					<a href="<?=$link?>"><?=$title?></a>
				</li>
			<?}
			endforeach ?>
			<li><noindex><a rel="nofollow" href="http://feeds.feedburner.com/wowlolru">RSS</a></noindex></li>
		</ul>
	</li>
	<li>
		<span>Бездна:</span>
		<ul>
			<? foreach ($MENU2 as $title => $link): ?>
			<?if ($link==$page) {?>
				<li>
					<span><?=$title?></span>
				</li>
			<?} else {?>
				<li>
					<a href="<?=$link?>"><?=$title?></a>
				</li>
			<?}
			endforeach ?>
		</ul>
	</li>
	<li>
		<span>Лолшто?</span>
		<ul>
			<? foreach ($MENU3 as $title => $link): ?>
			<?if ($link==$page) {?>
				<li>
					<span><?=$title?></span>
				</li>
			<?} else {?>
				<li>
					<a href="<?=$link?>"><?=$title?></a>
				</li>
			<?}
			endforeach ?>
		</ul>
	</li>	
	<li>
		<span>Прочее:</span>
		<ul>
			<? foreach ($MENU4 as $title => $link): ?>
			<?if ($link==$page) {?>
				<li>
					<span><?=$title?></span>
				</li>
			<?} else {?>
				<li>
					<a href="<?=$link?>"><?=$title?></a>
				</li>
			<?}
			endforeach ?>
		</ul>
	</li>
</ul>
А вот код динамического скрипта (не полный, только php часть):

Код:
@$p          = intval($_GET['p']);

$_bash_num   = $db->numrows("SELECT * FROM bash_approved WHERE bash_razdel = 'art'");
$_bash_num2   = $db->numrows("SELECT * FROM bash_approved WHERE bash_razdel = 'index'");
                         $num   = 20;
                         $total = @ceil($_bash_num/$num);
if(empty($p) || $p < 0): $p     = 1;         endif;
if($p > $total):         $p     = $total;    endif;
                         $start = max( 0, ($p * $num - $num) );

$_bash       = $db->queryArrayRow("SELECT * FROM bash_approved WHERE bash_razdel = 'art' ORDER BY bash_date_post DESC LIMIT ".$start.", ".$num);
$_bash_unapp = $db->numrows("SELECT * FROM bash_approved WHERE bash_razdel = 'abyss'");
$_app_today  = $db->numrows("SELECT * FROM bash_approved WHERE bash_date_post LIKE '%".date('Y-m-d')."%' AND bash_razdel = 'index'");


$pages = array();
$s     = 0;
$out   = '';

for($i = 1; $i <= $total; $i++) {
if( ($i <= 3  || ($i >= $p-3 && $i <= $p+3)  ||  $i > $total-3 ) && !in_array($i, $pages)) $pages[] = $i;
}

($p > 1 ? $out .= ' <a href="/art/'.($p-1).'">предыдущая</a> ' : $out .= '');

for($i = 0; $i < count($pages); $i++){
$s++;
($pages[$i] != $s ? $out .= ' ... ' : $out .= '');
($pages[$i] == $p ? $out .= ' <span>'.$pages[$i].'</span> ' : $out .= ' <a href="/art/'.$pages[$i].'">'.$pages[$i].'</a> ');
$s = $pages[$i];
}

($p < $total && $total > 1 ? $out .= ' <a href="/art/'.($p+1).'">следующая</a> ' : $out .= '');
Вот тоже самое, только для другого раздела (где без закрывающего слеша ссылка генерируется):

Код:
@$p          = intval($_GET['p']);

$_bash_num   = $db->numrows("SELECT * FROM bash_approved WHERE bash_razdel = 'comiserials'");
$_bash_num2   = $db->numrows("SELECT * FROM bash_approved WHERE bash_razdel = 'index'");
                         $num   = 20;
                         $total = @ceil($_bash_num/$num);
if(empty($p) || $p < 0): $p     = 1;         endif;
if($p > $total):         $p     = $total;    endif;
                         $stcomiserials = max( 0, ($p * $num - $num) );

$_bash       = $db->queryArrayRow("SELECT * FROM bash_approved WHERE bash_razdel = 'comiserials' ORDER BY bash_date_post DESC LIMIT ".$stcomiserials.", ".$num);
$_bash_unapp = $db->numrows("SELECT * FROM bash_approved WHERE bash_razdel = 'abyss'");
$_app_today  = $db->numrows("SELECT * FROM bash_approved WHERE bash_date_post LIKE '%".date('Y-m-d')."%' AND bash_razdel = 'index'");


$pages = array();
$s     = 0;
$out   = '';

for($i = 1; $i <= $total; $i++) {
if( ($i <= 3  || ($i >= $p-3 && $i <= $p+3)  ||  $i > $total-3 ) && !in_array($i, $pages)) $pages[] = $i;
}

($p > 1 ? $out .= ' <a href="/comiserials/'.($p-1).'">предыдущая</a> ' : $out .= '');

for($i = 0; $i < count($pages); $i++){
$s++;
($pages[$i] != $s ? $out .= ' ... ' : $out .= '');
($pages[$i] == $p ? $out .= ' <span>'.$pages[$i].'</span> ' : $out .= ' <a href="/comiserials/'.$pages[$i].'">'.$pages[$i].'</a> ');
$s = $pages[$i];
}

($p < $total && $total > 1 ? $out .= ' <a href="/comiserials/'.($p+1).'">следующая</a> ' : $out .= '');
Они практически идентичны. Где искать косяк???
 

blackcot

Well-Known Member
Регистрация
10.09.2009
Сообщения
439
Если Вам нуже слэш в конце ссылки (что правильнее, чем без него), то добавьте его в конец ссылки:
Код:
...
($p > 1 ? $out .= ' <a href="/art/'.($p-1).'/">предыдущая</a> ' : $out .= ''); 
...
($pages[$i] == $p ? $out .= ' <span>'.$pages[$i].'</span> ' : $out .= ' <a href="/art/'.$pages[$i].'/">'.$pages[$i].'</a> '); 
...
($p < $total && $total > 1 ? $out .= ' <a href="/art/'.($p+1).'/">следующая</a> ' : $out .= '');
...
($p > 1 ? $out .= ' <a href="/comiserials/'.($p-1).'/">предыдущая</a> ' : $out .= ''); 
...
($pages[$i] == $p ? $out .= ' <span>'.$pages[$i].'</span> ' : $out .= ' <a href="/comiserials/'.$pages[$i].'/">'.$pages[$i].'</a> '); 
...
($p < $total && $total > 1 ? $out .= ' <a href="/comiserials/'.($p+1).'/">следующая</a> ' : $out .= '');
...
Что касается шаблона меню, то там ссылка генерируется без слэша. Добавьте его в конец каждого элемента.
 

fantasy4fun

лдж в php
Регистрация
16.08.2009
Сообщения
136
Что касается шаблона меню, то там ссылка генерируется без слэша
от сюда и вопрос - как так - у идентичных шаблонов разделов половина генерируется с закрывающим слешем, половина без. Почему я затронул вопрос о .htaccess - как раз потому что если я просто в шаблоне меню сделаю с закрывающим слешем - то страница будет доступна и с закрывающим и без него, а нужно как раз автоматом редирект что бы шел (как в случае с разделом art)

<!-- вызываю креатора...-->
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
<!-- вызываю креатора...-->
:biggrin:

Отсюда вопрос - почему некоторые разделы открываются без закрывающего слеша в конце, а некоторые с ним ?
Согласен с blackcot, как ты в шаблоне задашь так и будет) При условии отсутствия 301 редиректов на страницу со слешем или без)

Значит, ты хочешь все слить на comiserials/, тогда уже не парься и просто подправь .htaccess

Код:
RewriteRule ^comiserials(/?)$ comiserials.php
замени на

Код:
RewriteRule ^comiserials$ comiserials/ [R=301,L]
RewriteRule ^comiserials/$ comiserials.php
 

fantasy4fun

лдж в php
Регистрация
16.08.2009
Сообщения
136
Всё гуд, всё работает, спасибо креатор. Пойду остальное так же переделаю
 
Статус
Закрыто для дальнейших ответов.
Верх Низ