Я только что обновил один из моих статических веб-сайтов на веб-сайте с включенным кодом. Мне нужно перенаправить точные имена доменов старого сайта на новые, чтобы избежать ошибки 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 и проверьте свой сайт.
После этого сайт не работает, пожалуйста, дайте мне знать.