Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Редирект старых чпу ссылок с /page__

Опубликовано:

Вот такие записи теперь получаются:

 

Sun, 11 Sep 2016 10:57:45 +0000
IPS\Http\Url\Exception: INVALID_PATH (0)
#0 /home/admin/web/ДОМЕН.ru/public_html/system/Http/Url.php(209): IPS\Http\_Url::componentsFromUrlString('http://ДОМЕН...', false)
#1 /home/admin/web/ДОМЕН.ru/public_html/init.php(442) : eval()'d code(25): IPS\Http\_Url::createFromString('http://ДОМЕН...', true, false)
#2 /home/admin/web/ДОМЕН.ru/public_html/system/Request/Request.php(232): IPS\Http\cms_hook_Url::createFromString('http://ДОМЕН...')
#3 /home/admin/web/ДОМЕН.ru/public_html/system/Dispatcher/Front.php(72): IPS\_Request->url()
#4 /home/admin/web/ДОМЕН.ru/public_html/system/Dispatcher/Dispatcher.php(86): IPS\Dispatcher\_Front->init()
#5 /home/admin/web/ДОМЕН.ru/public_html/index.php(13): IPS\_Dispatcher::i()
#6 {main}
Request-URI: /index.php/topic/10274-%d0%b2-%d1%80%d0%be%d1%81%d1%81%d0%b8%d0%b8-%d1%85%d0%be%d1%82%d1%8f%d1%82-%d0%b7%d0%b0%d0%bf%d1%80%d0%b5%d1%82%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bf%d0%b0%d1%82%d1%8c/page__st__2040
Array
(
   [0] => Array
       (
           [function] => exceptionHandler
           [class] => IPS\IPS
           [type] => ::
           [args] => Array
               (
                   [0] => IPS\Http\Url\Exception Object
                       (
                           [message:protected] => INVALID_PATH
                           [string:Exception:private] => 
                           [code:protected] => 0
                           [file:protected] => /home/admin/web/ДОМЕН.ru/public_html/system/Http/Url.php
                           [line:protected] => 932
                           [trace:Exception:private] => Array
                               (
                                   [0] => Array
                                       (
                                           [file] => /home/admin/web/ДОМЕН.ru/public_html/system/Http/Url.php
                                           [line] => 209
                                           [function] => componentsFromUrlString
                                           [class] => IPS\Http\_Url
                                           [type] => ::
                                           [args] => Array
                                               (
                                                   [0] => http://ДОМЕН.ru/index.php/topic/10274-%d0%b2-%d1%80%d0%be%d1%81%d1%81%d0%b8%d0%b8-%d1%85%d0%be%d1%82%d1%8f%d1%82-%d0%b7%d0%b0%d0%bf%d1%80%d0%b5%d1%82%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bf%d0%b0%d1%82%d1%8c/page__st__2040
                                                   [1] => 
                                               )

                                       )
                               )
                           [previous:Exception:private] => 
                       )
               )
       )
)

 

Я так понимаю это переходы по старым ссылкам, которые были в 3-ей версии IP.Board. В старых версиях url страницы тем имели окончание page__st__2040, а теперь имеют вид ?page=6 . И ещё после перехода на IPS 4.0 я сменил кирилические Url на латинские (поставил плагин "Friendly URL Translit"), может из за этого?

 

Что сделать, чтобы исправить эту ошибку?

Рекомендованные сообщения

Опубликовано:

Регулярное выражение которое проверяет валидность урл компонентов учитывает только закодированные символы в верхнем регистре, так как адрес в данном случае в нижнем регистре из-за бага в regexp'е он не проходит валидацию.

 

В \system\Http\Url.php

Найти

%[A-F0-9]{2}

Заменить на

%[A-Fa-f0-9]{2}

Опубликовано:

Но для полной поддержки параметров из /page__ нужно сделать отдельный редирект.

 

В .htaccess после RewriteEngine on (если его нету - добавить) добавить:

 

RewriteRule ^index\.php/(topic)/ redirect.php [L,QSA]

В корне форума создать файл redirect.php со следующем кодом

 

<?php

require_once 'init.php';
\IPS\Dispatcher\Build::i();

if( preg_match( '#/(?<type>topic)/(?<id>\d+)(-(?<title>[^/]+))?/(?:page__(?<page>.*?)(?:\?|$))?#', $_SERVER['REQUEST_URI'], $match ) )
{
$request = array();

if( $match['page'] )
{
	$bits = explode( '__', $match['page'] );
	for( $i=0; $i<count($bits); $i += 2 )
	{
		$request[ $bits[ $i ] ] = urldecode( $bits[ $i+1 ] );
	}
}

if( $match['type'] == 'topic' )
{
	try
	{
		$topic = \IPS\forums\Topic::load( (int) $match['id'] );
	}
	catch( \Exception $e )
	{
		\IPS\Output::i()->redirect( \IPS\Http\Url::baseUrl() );
	}

	$url  = $topic->url();
	$view = array( 'getnewpost' => 'getNewComment', 'getlastpost' => 'getLastComment' );

	if( $request['view'] AND isset( $view[ $request['view'] ] ) )
	{
		$url = $url->setQueryString( 'do', $view[ $request['view'] ] );
	}
	elseif( count( $k = array_intersect( array( 'p', 'pid', 'findpost', 'gopid' ), array_keys( $request ) ) ) )
	{
		$url = $url->setQueryString( array( 'do' => 'findComment', 'comment' => $request[ current( $k ) ] ) );
	}
	elseif( $request['st'] )
	{
		$page = floor( intval( $request['st'] ) / $topic::getCommentsPerPage() ) + 1;
		$url = $url->setQueryString( 'page', $page );
	}

	\IPS\Output::i()->redirect( $url );
}
}

\IPS\Output::i()->redirect( \IPS\Http\Url::baseUrl() );

  • 3 месяца спустя...
Опубликовано:
  • Автор

siv1987, обновил форум до 4.1.16.1 и очевидно затерся файл .htaccess и теперь со старых ссылок с _http://domen.ru/index.php/forum/42-primer/ не работает редирект на _http://domen.ru/forum/2-osnovnoy-forum/ .

 

Сейчас .htaccess такой:

<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteRule ^index\.php/(topic)/ redirect.php [L,QSA]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.(js|css|jpeg|jpg|gif|png|ico|map)(\?|$) /404error.php [L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

 

 

И не работает именно в разделах форума, в темах всё нормально. Что добавить .htaccess , чтобы заработало?

 

 

P.s. В темах очевидно работает, потому что использую ваш код, который выше.

Опубликовано:

А почему он должен работать если это два разных форума?

Чтобы убрать index.php из адреса, после RewriteEngine добавить RewriteRule ^index\.php/(forum/.*) /$1 [R=301,L]

Опубликовано:
  • Автор
А почему он должен работать если это два разных форума?

На 4.1.14 всё работало. А после обновления перестало. В аднимке в логах, что на _http://domen.ru/index.php/forum/42-primer/ произошла ошибка.

Изменено пользователем ralf

Опубликовано:
  • Автор
Чтобы убрать index.php из адреса, после RewriteEngine добавить RewriteRule ^index\.php/(forum/.*) /$1 [R=301,L]

Добавил, теперь работает. Спасибо!

  • 8 месяцев спустя...
Опубликовано:

у меня аналогичная проблема. В старых версиях url страницы имели окончание /page6, а теперь имеют вид /?page=6

Попробовал как описано выше - не помогло.

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.