2011-04-22 17 views
6

Quiero que mi carpeta public_html en mi servidor sea la carpeta pública en mi proyecto zend. Ustedes alguna idea de cómo puedo hacer esto? En este momento tengo que ver con mi sitio domain.com/public¿Cambiar la ubicación de la carpeta pública en el proyecto Zend_Framework?

He intentado cambiar el archivo index.php a esta (cambiado los directorios)

// Define path to application directory 
defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . 'application')); 

// Define application environment 
defined('APPLICATION_ENV') 
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production')); 

// Ensure library/ is on include_path 
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . 'library'), 
    get_include_path(), 
))); 

/** Zend_Application */ 
require_once 'Zend/Application.php'; 

// Create application, bootstrap, and run 
$application = new Zend_Application(
    APPLICATION_ENV, 
    APPLICATION_PATH . '/configs/application.ini' 
); 
$application->bootstrap() 
      ->run(); 

Pero esto no funciona. ¿Alguna idea de cómo puedo arreglar esto?

Quiero básicamente una estructura de directorios como esto:

public_html/ 
----application/ 
----library/ 
----index.php 

o hay alguna otra manera de lograr esto? Quiero que 'public' se haya ido de mi URL de todos modos.

¿Alguna idea?

Respuesta

4

si su .htaccess está configurado correctamente, no tiene que preocuparse de que las personas accedan a la carpeta de su biblioteca, las sencillas reglas de reescritura pueden evitarlo.

continuación es lo que he utilizado para deshacerse del directorio público en mi index.php

$path = realpath(dirname(__FILE__)); 
$dirs = array(
     $path . '/library', 
     get_include_path() 
); 
$includes = implode(PATH_SEPARATOR, $dirs); 
set_include_path($includes); 

defined('APPLICATION_PATH') 
     || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/application')); 

defined('APPLICATION_ENV') 
     || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production')); 

require_once 'Zend/Application.php'; 

$application = new Zend_Application(
       APPLICATION_ENV, 
       APPLICATION_PATH . '/configs/application.ini' 
); 

y este es mi .htaccess

<IfModule mod_rewrite.c> 
Options +FollowSymLinks 
Options -Indexes 
RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .* - [L] 

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 

RewriteRule ^.*$ - [NC,L] 
RewriteRule \.svn/.* index.php [L] 
RewriteRule ^.*$ index.php [NC,L] 
</IfModule> 
2

¡Ese es el enfoque equivocado! La razón por la que tenemos una carpeta pública y casi todo lo demás está en el mismo nivel es una razón de seguridad. ¡No queremos tener nuestras bibliotecas y código de aplicación en nuestra carpeta pública!

Lo único que necesita cambiar es su configuración de servidor (apache) vhost para que apunte a su carpeta pública como la raíz del documento.

<VirtualHost *:80> 
DocumentRoot /path/to/your/public/folder 
ServerName domain.com 
    <Directory path/to/your/public/folder> 
     AllowOverride All 
    </Directory> 
</VirtualHost> 
+0

Estoy en un servidor compartido sin acceso Para hacer eso. Además, en este caso particular, Zend se está ejecutando en un subdominio. como 'sub.domain.com'' sub' es solo una carpeta dentro de la carpeta 'public_html', por lo que cada carpeta de Zend se puede acceder a través de' domain.com/application' de todos modos ... – networkprofile

+0

no necesariamente es el caso. siempre que configure el htaccess junto con los permisos del archivo, no debería tener mucho de qué preocuparse – Ascherer

+0

Incluso los proveedores de servicios compartidos ofrecen directorios privados donde puede ingresar el código. – hakre

1

This post uno sugiere enfoque bastante fácil (esencialmente, eliminar public y empujar todos los archivos de ZF en una subcarpeta), pero también hace referencia a varios otros enfoques.

En particular, los comentarios en ese puesto sugieren que sólo tiene que modificar el archivo .htaccess en la raíz de su subdominio para empujar todas las peticiones hacia abajo en la carpeta pública:

RewriteEngine on 
RewriteRule ^.* /public/$0 [L] 

A continuación, en la carpeta public, usted mantiene el estándar .htaccess. En el peor de los casos, también debe configurar el baseUrl de la aplicación durante Bootstrap, probablemente a través de config.

+0

Lo hice de esta manera, ¡gracias! – networkprofile

+0

Me alegro de que haya ayudado. ¡Aclamaciones! –

Cuestiones relacionadas