301 перенаправление для старых страниц веб-сайта с помощью codeIgniter

Я только что обновил один из моих статических веб-сайтов на веб-сайте с включенным кодом. Мне нужно перенаправить точные имена доменов старого сайта на новые, чтобы избежать ошибки 404.

  • Старые страницы> http://example.com/pagename.php
  • Новые страницы> http://example.com/index.php/home/category_images/9(cat_id)

Я не очень высокий нет. страниц, поэтому жесткое кодирование всех страниц напрямую не будет проблемой. Я пытался :

 RewriteEngine On RewriteBase / RewriteRule ^http://www.example.com/pagename.php$ http://example.com/index.php/home/category_images/9 [L,R=301] 

Не работает, я понятия не имею, почему. mod_rewrite на моем сервере apache.

Кроме того, просто для подтверждения, пожалуйста, также сообщите мне, в какой папке я должен поместить этот файл, я запутался между корневым каталогом или папкой приложения.

Спасибо.

Версия 2: теперь, после предложения от г-на Майкла, я попытался реализовать его с помощью функции перенаправления следующим образом:

Функция контроллера по умолчанию: home.php

 function __construct() { // Call the Model constructor parent::__construct(); $this->load->model('common_model'); $this->handle_redirects(); } function handle_redirects () { $redirects = Array( 'gorgeous-girls.php' => 'home/category_images/9' ); $uri = implode('/', $this->uri->segments); foreach ($redirects as $from => $to) { $from = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $from)); if (preg_match("#^{$from}$#i", $uri)) { if (strpos($to, '$') !== false and strpos($from, '(') !== false) $to = preg_replace("#^{$from}$#i", $to, $uri); redirect($to , 'location', 301); } } } 

И мой .htaccess выглядит так:

 RewriteEngine On RewriteBase / RewriteCond $1 !^(index.php|resources|robots.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php?/$1 [L] 

PS: Я удалил index.php из моей структуры имени домена. Он выглядит так: www.example.com/controller/function/uri/uri

Теперь я не получаю страницу ошибки с моего хоста, но я получаю страницу ошибки от CodeIgniter.

Пожалуйста помоги.

Учитывая, что ваш файл гипертекстового доступа должен все равно маршрутизировать все через index.php , лучше всего обработать ваши перенаправления с помощью функции redirect() CodeIgniter.

Ниже приведен пример, основанный на том, что у меня есть на моем контроллере страницы , в моих собственных расширениях фреймворка (его можно использовать везде, где доступна функция redirect() , а также $this->uri->segments .

 function handle_redirects () { $redirects = Array( 'pagename.php' => 'home/category_images/9' ); $uri = implode('/', $this->uri->segments); foreach ($redirects as $from => $to) { $from = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $from)); if (preg_match("#^{$from}$#i", $uri)) { if (strpos($to, '$') !== false and strpos($from, '(') !== false) $to = preg_replace("#^{$from}$#i", $to, $uri); redirect($to , 'location', 301); } } } 

Если вы должны передать запрос в файл pagename.php в своей структуре, вы можете рассмотреть следующее (обратите внимание, что я не знаю, каково намерение ваших страниц – это общее решение):

 $redirects = Array( 'pagename.php?q=(:any)' => 'home/category_images/$1' ); 

Например:

 http://example.com/pagename.php?q=9 

перенаправляет вас на:

 http://example.com/home/category_images/9 

Это решение работает для меня достаточно хорошо и очень эффективно, когда речь заходит о совместимости между браузерами.

Обратите внимание, что ваш RewriteRules должен выглядеть так или что-то похожее на него:

 RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} -f RewriteRule (xml|txt|css|js|jpg|png|gif)$ - [L] RewriteRule .* index.php [L,QSA] 

Изменить : Вышеуказанное было изменено для размещения активов. В основном, он сообщает Apache маршрутизировать все через index.php , если только он не существует и имеет указанные расширения. (Это хорошая практика в целях безопасности.)

Изменить : обратите внимание, что вы не должны включать index.php в свой URL, поскольку он все равно лишается файла .htaccess .

Обратите внимание, что я использую PHP 5.3 – хотя это решение должно работать на вас. Пожалуйста, дайте мне знать, если возникнут какие-либо проблемы.

Вы не используете полное доменное имя в части соответствия правила перезаписи. Попробуй это:

 RewriteRule ^pagename.php$ /index.php/home/category_images/9 [L,R=301] 

Конечно, вам, скорее всего, понадобятся другие правила для сервера, чтобы понять, что index.php – это файл, который должен вызываться, а не что-то в /image.php/home/category_images/9

Поэтому, возможно, второе правило, подобное

 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^index.php/(.*) /index.php?q=$1 [L] 

Я просто заметил, что в вашем обновленном ответе вы пытаетесь перенаправить с http://www.example.com на example.com. Если вы хотите принудительно создать один домен, вероятно, вы должны добавить другое правило в свой .htaccess до того, как будет указано другое из следующих правил:

 RewriteCond %{HTTP_HOST} ^www.example.com$ Rewrite Rule ^(.*)$ http://example.com/$1 [L,R=301] 

вы можете открыть xampp / apache / conf / httpd.conf

После этого проверьте строку ниже

 #LoadModule rewrite_module modules/mod_rewrite.so 

если Hash (#) существует над линией. затем удалите его.

 LoadModule rewrite_module modules/mod_rewrite.so 

и перезагрузите сервер Apache и проверьте свой сайт.

После этого сайт не работает, пожалуйста, дайте мне знать.