Apache: 403 Forbidden con Codeigniter

Siguiendo con el error 403 Forbidden en Apache con Codeigniter pues busqué y busqué la solución, ya que la que habia investigado antes pues era temporal, y despues de navegar por X número de páginas zaaas, vuelve a salir el error 403.

La solución sigue estando en la configuración de Apache2.0 y el módulo rewrite, primero modificamos el archivo en /etc/apache2/sites-enabled/000-default (u otro parecido)

< Directory />
Options FollowSymLinks SymLinksIfOwnerMatch
AllowOverride FileInfo
< /Directory>

Y despues en el .htaccess, o lo pueden poner en el otro archivo la siguiente info:

< IfModule mod_mime.c>
AddType text/html;charset=UTF-8 .html
< /IfModule>

< IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

#Removes access to the system folder by users.
#Additionally this will allow you to create a System.php controller,
#previously this would not have been possible.
#’system’ can be replaced if you have renamed your system folder.
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

#When your application folder isn’t in the system folder
#This snippet prevents user access to the application folder
#Submitted by: Fabdrol
#Rename ‘application’ to your applications folder name.
RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

#Checks to see if the user is attempting to access a valid file,
#such as an image or css document, if this isn’t true it sends the
#request to index.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_URI} !^(/index\.php|/img|/js|/css|/kml|/robots\.txt|/favicon\.ico)

RewriteRule ^(.*)$ /index.php/$1 [L]
< /IfModule>

< IfModule !mod_rewrite.c>
# If we don’t have mod_rewrite installed, all 404’s
# can be sent to index.php, and everything works as normal.
# Submitted by: ElliotHaughin

ErrorDocument 404 /index.php
< /IfModule>

Donde dice UTF8 es para que todas las páginas HTML las mande con ese encoding, y la parte que creo es importante es donde se filtra el js, css, pero bueno!, ya con eso funciona bien el codeigniter y sin errores 403 forbidden.

Ushahidi en Nginx con url amigables

Para instalar Ushahidi en un servidor Nginx se requiere algo de configuración especial para que funcione al 100%., para eso creamos un sitio en /etc/nginx/sites-enabled lo llamaremos ushahidi en donde pondremos algo así:

server {
listen 80;
server_name ushahidi.oviedo.mx;
root /var/www/ushahidi;
index index.php;

# ROUTING TO USHAHIDI IF REQUIRED
location / {
try_files $uri $uri/ @ushahidi;
rewrite ^/(.*)$ /index.php/$1 break;
}

# BLOCKS ACCESS TO . FILES (.svn, .htaccess, …)
location ~ /\. {
deny all;
}

# FOR PHP FILES
location ~* \.php$ {
# PHP FILES MIGHT BE TO HANDLED BY USHAHIDI
try_files $uri $uri/ @ushahidi;

include fastcgi_params;
fastcgi_pass unix:/tmp/php.socket;
}

# HANDLES THE REWRITTEN URLS TO USHAHIDI CONTROLLER
location @ushahidi
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php.socket;
}

# CACHE CONTROL FOR STATIC FILES
location ~* \.css|\.js|\.jpg|\.jpeg|\.png|\.gif|\.swf|\.svg|\.tiff|\.pdf$ {
expires 30d;
}
}

En negrita lo que deben de cambiar con la info de su servidor, igual puede que tengan algo diferente pero pues ya es una idea, como ushahidi esta basado en Kohana pues de ahi me vole las reglas y las adapte a mis necesidades

No olviden en la configuración del ushahidi application/config/config.php cambiar la linea donde dice: $config[‘index_page’] = ‘index.php’; por

$config[‘index_page’] = ”;

Para que funcionen bien las páginas.

Apache: 403 Forbidden

Algunas veces cuando estoy navegando en un sistema que realice el cual esta montado en Apache2 con URL amigables me aparecé el error 403 Forbidden y dice que no tiene privilegios para acceder al recurso.

Investigando un poco resulta que el problema esta con el modulo Rewrite de Apache ( mod_rewrite ) y la solución es habilitar enlaces simbolicos, teniendo nuestro .htaccess algo así:

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

Observen que se tiene la opción: +FollowSymLinks esto hace que el error 403 no aparezca más.

Y si estan usando CodeIgniter pues este código les sirve para tener URL amigables =)

Public NTP Secondary (stratum 2) Time Servers

A continuación se mostrará la lista de servidores NTP (Network Time Protocol) públicos de stratum 2

Estan clasificados en dos tipos basicamente (Por nivel de precision):

  • Stratum 1: sincronizan con fuentes de tiempo externas (relojes atómicos o radio-antenas).
  • Stratum 2: sincronizan con los Stratum 1.
  • Stratum n: Sincronizan con Stratum n-1 (siendo “n” 3 en el caso de sincronizar con un Stratum 2).

Continue reading

Public NTP Primary (stratum 1) Time Servers

A continuación se mostrará la lista de servidores NTP (Network Time Protocol) públicos de stratum 1

Estan clasificados en dos tipos basicamente (Por nivel de precision):

  • Stratum 1: sincronizan con fuentes de tiempo externas (relojes atómicos o radio-antenas).
  • Stratum 2: sincronizan con los Stratum 1.
  • Stratum n: Sincronizan con Stratum n-1 (siendo “n” 3 en el caso de sincronizar con un Stratum 2).

Continue reading

Servidores NTP públicos

A continuación se mostrará una lista de servidores NTP (Network Time Protocol) públicos.

Estan clasificados en dos tipos basicamente (Por nivel de precision):

  • Stratum 1: sincronizan con fuentes de tiempo externas (relojes atómicos o radio-antenas).
  • Stratum 2: sincronizan con los Stratum 1.
  • Stratum n: Sincronizan con Stratum n-1 (siendo “n” 3 en el caso de sincronizar con un Stratum 2).

Esta estructura gerárquica existe para no sobrecargar a los Stratum 1. Posiblemente sea mas preciso, un Stratum 2 cercano que un Stratum 1 lejano. Desde aqui yo te recomiendo un Stratum 2, si vas a trabajar con ellos solo de cliente. (deja los Stratum 1 para los que monten un Stratum 2.)

La lista fue extraida de http://kopernix.com/?q=ntp la cual fue extraida de http://www.eecis.udel.edu/~mills/ntp/clock2a.html jeje, otro respaldo más para internet.

Aquí las ligas para ver los Stratum 1 y los Stratum 2

Linux: Actualizar el horario automaticamente

Como ya sabrán el día de hoy se tiene que adelantar el reloj 1 hora por el “horario de verano”, pero que pasa si lo queremos hacer automaticamente y ademas siempre tener la hora exacta, la solución es NTP (Network Time Protocol), lo bueno que linux (y todos los sistemas operativos, lease Windows y Mac) tienen este protocolo.

Primero debemos de ver que hora es la actual, ejecutando el comando:

#date
Sun Apr 3 14:14:04 UTC 2011

Si se fijan me dice que la hora es del tipo UTC, pero nosotros la ocupamos especificamente de nuestro lugar, México.

para hacer ejecutamos el comando tzdata, en este caso lo vamos a reconfigurar:

# dpkg-reconfigure tzdata

1.- Nos pregunta el área geografica: America
2.- Buscamos Mexico_City

y listooo!.., al final nos aparece el cambio:

Current default time zone: ‘America/Mexico_City’
Local time is now: Sun Apr 3 09:14:53 CDT 2011.
Universal Time is now: Sun Apr 3 14:14:53 UTC 2011.

Si se fijan ahora dice CDT y no el horario universal, si vuelven a ejecutar date les aparecerá correcta la hora.

Ahora bien sigue la automatización de la hora, como les decia esta el protocolo NTP, y en linux existe un comando llamando ntp, para instalarlo sencillo:

#apt-get install ntp

y en el archivo /etc/ntp.conf buscamos la linea donde dice server, por default dice: server ntp.ubuntu.com (o depende de su distribución)

Podemos agregar algun servidor NTP que este cerca fisicamente de nuestra computadora.

# You do need to talk to an NTP server or two (or three).
server cronos.cenam.mx
server ntp.ubuntu.com

En este caso estamos utilizando el del Centro de Meteorología Nacional en México., en esta página podemos ver un listado de varios servidores, se recomienda utilizar el stratum 2 o stratum 1 http://kopernix.com/?q=ntp

Y listo! todo debe de funcionar al 100

PHP: la función imagefilter no es reconocida en PHP5

Estaba probando la creación de mapas de calor (heat map) con PHP y en mi maquina local todo funciona correcto para al pasarla al servidor saaz, error de PHP.

Fatal error: Call to undefined function imagefilter()

revisando la documentación de la función imagefilter dice que viene en la librería GD y PHP5, los 2 programas ya los tenia instalados, pero aún así no reconocía la función, e investigando dice que se ocupa instalar la libreria PHP5-GD Bundled (embedida o empaquetada), ya que la versión original fue desarrollada por Boutell.

Ahora al grano! a instalar la nueva librería, para eso la vamos a compilar todo a mano, jejeje:

apt-get update
apt-get install build-essential debhelper fakeroot
cd /usr/src
apt-get source php5
apt-get build-dep php5
cd php5-5.2.4

Recuerden cambiar la versión del PHP descargada, despues a modificar el archivo debian/rules

nano ./debian/rules

Buscamos la línea que diga:

–with-gd=shared,/usr –enable-gd-native-ttf \

Y la cambiamos por esta:

–with-gd=shared –enable-gd-native-ttf \

Ahora viene la parte tardadaaaaaa!!! a compilar todo,

dpkg-buildpackage -rfakeroot
cd ..
apt-get remove php5-gd
dpkg -i php5-gd_5.2.4-2ubuntu5.14_i386.deb

Reiniciamos apache y listo! la librería php5-gd debe de quedar OK!..

/etc/init.d/apache2 restart

Aca una imagen de como quedo el mapa de calor:

Codeigniter: Modificar LIMIT para el driver MSSQL

Después de encontrar la solución para que funcione el LIMIT de MySQL en Microsoft SQL Server ahora sigue el turno de modificar el código de Codeigniter para así tener algo transparente para nuestras consultas SQL.

Lo primero que se debe de hacer es modificar la librería de carga del Codeigniter, ( $this->load-> )
Vamos a trabajar en la carpeta: /system/application/libraries/ y creamos un archivo llamado: MY_Loader.php con el siguiente código:

< ?php class MY_Loader extends CI_Loader{ / * Constructor, calls parent constructor. */ function MY_Loader() { parent::CI_Loader(); } / * Database Loader * * @access public * @param string the DB credentials * @param bool whether to return the DB object * @param bool whether to enable active record (this allows us to override the config setting) * @return object */ function database($params = '', $return = FALSE, $active_record = FALSE) { // Do we even need to load the database class? if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE) { return FALSE; } require_once(BASEPATH.'database/DB'.EXT); // Load the DB class $db =& DB($params, $active_record); $my_driver = config_item('subclass_prefix').'DB_'.$db->dbdriver.’_driver’;
$my_driver_file = APPPATH.’libraries/’.$my_driver.EXT;

if (file_exists($my_driver_file))
{
require_once($my_driver_file);
$db =& new $my_driver(get_object_vars($db));
}

if ($return === TRUE)
{
return $db;
}
// Grab the super object
$CI =& get_instance();

// Initialize the db variable. Needed to prevent
// reference errors with some configurations
$CI->db = ”;
$CI->db = $db;
// Assign the DB object to any existing models
$this->_ci_assign_to_models();
}

}

La idea de este archivo es extender la funcionalidad de carga de los drivers para la base de datos, despues en la misma carpeta de libraries creamos un archivo llamado: MY_DB_mssql_driver.php ya que estamos usando el driver mssql para nuestra conexión SQL Server

< ?php class MY_DB_mssql_driver extends CI_DB_mssql_driver { function __construct($params){ parent::__construct($params); log_message('debug', 'Extended DB driver class instantiated!'); } function _limit($sql, $limit, $offset){ if($offset == 0){ return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); }else{ $OrderBy = "ORDER BY "; if (count($this->ar_orderby) > 0){
$OrderBy .= implode(‘, ‘, $this->ar_orderby);

if ($this->ar_order !== FALSE)
{
$OrderBy .= ($this->ar_order == ‘desc’) ? ‘ DESC’ : ‘ ASC’;
}
}else{
$OrderBy .= “(SELECT 1)”;
}

$sql = preg_replace(‘/(\\’. $OrderBy .’\n?)/i’,”, $sql);
$sql = preg_replace(‘/(^\SELECT (DISTINCT)?)/i’,’\\1 ROW_NUMBER() OVER (‘.$OrderBy.’) AS rownum, ‘, $sql);
return “SELECT * \nFROM (\n” . $sql . “) AS A \nWHERE A.rownum BETWEEN (” .($offset + 1) . “) AND (“.($offset + $limit).”)”;
}
}

Y listo! con esto nuestra consulta LIMIT será transparente y se usará como siempre: $this->db->limit(2,10);

Aca les dejo las fuentes de esta información: