живой сервер показывает ошибку 404, но не на локальном, codeigniter 3

#php #codeigniter

#php #codeigniter

Вопрос:

У меня есть четыре идентичные страницы, которые отличаются только некоторыми идентификаторами, но логика очень похожа. Все они работают на localhost. Три из этих страниц нормально работают на live server, но одна из них возвращает 404 по каким-то причинам, которые я не могу понять.

Я использую XAMPP 3.2.2 и Sublime для его разработки на локальном. Я перенес его в GoDaddy Deluxe Linux для live. Моя версия Codeigniter — 3.1.10.

Я уже пробовал ответы на большинство вопросов по StackOverflow:

  1. Первые буквы всех названий контроллеров и моделей написаны заглавными буквами в имени файла и внутри файла.

  2. Все коды .htaccess здесь: https://github.com/tasmanwebsolutions/htaccess_for_codeigniter

  3. У меня есть два файла .htaccess, один из них находится внутри папки приложения, а другой — снаружи. Я не знаю, сбивает ли это с толку систему? Но у меня есть другой веб-сайт на другом хостинге, который имеет те же файлы .htaccess, и они работают нормально. И в любом случае, если это сбивает систему с толку, почему это влияет только на одну из четырех идентичных страниц?

.htaccess внешняя папка приложения

 <IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>
  

.htaccess внутри папки приложения:

 <IfModule authz_core_module>
    Require all denied
</IfModule>
<IfModule !authz_core_module>
    Deny from all
</IfModule>
  

Все контроллеры четырех файлов имеют это значение:

 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
//session_start(); //we need to call PHP's session object to access it through CI

class Question1 extends CI_Controller
{
  

а остальное — обычный код, который работает с тремя из этих четырех файлов.

В конфигурации. php у меня есть:

 $config['uri_protocol'] = 'REQUEST_URI';
  

и base_url великолепен.

Насколько я вижу, модели и представления в порядке, а остальная часть веб-сайта работает нормально с включенным .htaccess. Мои маршруты также работают нормально.

Я сейчас так потерян.

PS. У меня есть пользовательская страница 404. Когда я ввожу assessment.com/index.php/question1 он показывает эту пользовательскую страницу 404. Но когда я открываю assessment.com/question1 он показывает собственную страницу codeigniter 404 (а не мою пользовательскую, по некоторым причинам). Я думаю, это о чем-то говорит, я просто не знаю, о чем.

Редактировать

Вот мой routes.php:

 $route['default_controller'] = 'home';
$route['404_override'] = 'Error404';
$route['translate_uri_dashes'] = TRUE;
  

Я решил не делать
$route[‘question1’] = «Question1»;
в маршрутах, потому что это ничего не меняет.

Комментарии:

1. Можете ли вы написать URL-адрес для страницы, которую вы не видите? И вам действительно нужны два .htaccess файла? … Или это может быть объединено в один htaccess-файл? Это способ записать что-то из вашего .htaccess файла, что может помочь при отладке. И если бы это был я, то я бы просмотрел свой код и попытался написать <?php echo 'Does it reach this point'; die(); ?> , чтобы увидеть, где в коде проблема.

2. URL, к которому я не могу получить доступ, assessment.com/question1 . У меня есть assessment.com/question2 и assessment.com/question3 к которому я могу получить доступ без каких-либо проблем. Их единственными различиями являются имена переменных и пара значений. Я попытался объединить оба файла .htaccess, он возвращает ошибку для всего сайта. Кроме того, все файлы .htaccess, которые я предоставил, относятся к if . Это не очень сложно проверить построчно.

3. Попробуйте добавить весь .htaccess к вашему вопросу (в качестве дополнения внизу), чтобы я (и другие) могли видеть, что вы пробовали.

4. Работает ли явное добавление маршрутов для всех 4 URI, подобных $route['questionX'] = 'questionX/index'; работе? Что-нибудь в журналах? Попробуйте увеличить пороговое значение журнала в вашем config.php . Попробуйте удалить весь свой код и просто выполнять echo "questionX"; в каждом методе, может быть, проблема в коде, а не в маршрутизации? Я все еще подозреваю, что в вашем Question1 классе, файле или методе есть что-то другое.

5. На самом деле это не маршруты. Я попытался добавить $route[‘questionX’] = ‘questionX/index’; в мои маршруты, и это не помогло. Я повторил «questionx» в контроллере Question1 / index (), и он появился! Итак, похоже, что проблема в моем контроллере. Сейчас я нахожусь в процессе ее исправления, основываясь на вашем мнении.

Ответ №1:

Проверьте режим СРЕДЫ вашего приложения. Вы можете найти ее в своем проекте root_folder/index.php и в строке № 57.

 define('ENVIRONMENT', 'production');
  

Измените режим СРЕДЫ на режим разработки, то есть

 define('ENVIRONMENT', 'development');
  

Затем снова обновите свои приложения. Если вы видите ошибку CodeIgniter по умолчанию, вы можете понять, что ваше приложение CodeIgniter работает нормально, и проверить ошибку.Если он не показывает никакой ошибки, то ваш .httaccess имеет какую-либо ошибку. Я решил свою ошибку 404 с помощью этого кода, вы можете это проверить.

 <IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    RewriteCond %{REQUEST_URI} ^asset.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
  

Комментарии:

1. Я нашел это в строке 56: define(‘ENVIRONMENT’, isset($ _SERVER[‘CI_ENV’]) ? $ _SERVER[‘CI_ENV’]: ‘development’); Я предполагаю, что я уже в режиме разработки? Я также попробовал ваш файл .htaccess, все еще ошибка.

Ответ №2:

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

Итак, пользователь Don’t Panic предложил мне повторить только «вопрос x» в проблемном контроллере, и когда я это сделал, ошибка 404 исчезла, и она повторила «вопрос x». Так что, безусловно, проблема в моем контроллере, а не в моих файлах routine или .htaccess.

Теперь этот контроллер спроектирован таким образом, что он сначала вызывает идентификатор из базы данных, прежде чем что-либо показывать. После того, как я повторил «вопрос x», я понял, что идентификатор, который он вызывает из моей базы данных, имеет нулевое значение. Поэтому неудивительно, что с точки зрения контроллера страница не существует! Отсюда и 404.

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