Regla de reescritura de WordPress y CI en htaccess

10 minutos de lectura

avatar de usuario
Pawan Thakur

He instalado WordPress en example.com. También he instalado CodeIgniter en ci carpeta aquí example.com/ci/, ci es el nombre de la carpeta, register es el nombre del controlador y la URL de trabajo de CI es example.com/ci/register . Mi URL base comienza con https:// .

Ahora tengo una URL de WordPress example.com/hotel, hotel es la página que he creado en el administrador de WordPress, funciona bien.

Quiero ejecutar mi ruta de CI como example.com/hotel/ci/registercreo que podemos hacerlo con alguna regla de reescritura para que mi URL se vea como example.com/hotel/ci/register. he añadido dado htaccess para wordpress que me redirige aquí example.com/hotel/ci/register. me esta mostrando 404 error de CI. Significa que ahora estoy en CI. Ahora hice lo siguiente en routes.php expediente.

$route['default_controller'] = 'register';
$route['404_override'] = 'register';

Ahora esta URL example.com/hotel/ci/register está funcionando, pero esta no es la forma correcta, la próxima vez habrá más controladores, entonces no funcionará.

Nota: no puedo crear hotel carpeta porque hotel es una página en WordPress. si creo hotel carpeta, entonces la URL de WordPress ejemplo.com/hotel/ no funcionará. Redirigirá la página de WordPress a la hotel carpeta. Así que tengo que hacerlo sin crear hotel carpeta. Tenga en cuenta ejemplo.com=myurl.com .

Necesito encontrar otra buena solución. ¿Algún consejo u orientación sería muy apreciado?

La siguiente es mi regla de reescritura en wordpress htaccess:

# BEGIN WordPress
   <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^/?hotel/ci/register(/.*)?$ /ci/$1 [L]
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
# END WordPress

Y el siguiente es mi CI htaccess:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA] 
</IfModule>

  • Publica tu ci carpeta .htaccess

    – Xpleria

    27 de octubre de 2017 a las 12:54


  • has cambiado el base_url en el config.php archivo para que coincida con la nueva ruta de URL?

    – am05mhz

    2 de noviembre de 2017 a las 8:46

  • esta es la url ejemplo.com/ci

    – Pawan Thakur

    2 de noviembre de 2017 a las 8:58

  • Solo un aviso, debe poner su regla personalizada fuera de #BEGIN y #END WordPress comentarios, ya que podría sobrescribirse con una actualización.

    – tobiv

    3 de noviembre de 2017 a las 9:06

  • Lo haré. Gracias por decirme

    – Pawan Thakur

    3 de noviembre de 2017 a las 9:12

avatar de usuario
No entrar en pánico

¡Problema interesante! Configuré un contenedor Docker con una instalación nueva de WordPress y Codeigniter, creé un hotel página en WP, y una Register controlador y vista en CI, y obtuve pruebas. Pasé demasiado tiempo en esto, pero encontré una respuesta.

Primero, tu WordPress .htaccess. Como señaló @tobiv en un comentario, no debe agregar nada entre el BEGIN/END WordPress comentarios, ya que podría ser golpeado por una actualización de WP. Tu redirección tiene que venir antes de Sin embargo, las reglas estándar de WP, así que agréguelo en el parte superior del archivo:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^hotel/ci/register /ci/register [L]
</IfModule>

# BEGIN WordPress
# ... These are the default, unchnaged WP rules
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

<IfModule mod_rewrite.c> y RewriteEngine On están duplicados, lo que parece complicado, pero los necesita, ya que su nueva regla tiene que ir primero, por lo que procesa la solicitud antes que las reglas de WP.

No necesitas modificar el Codeigniter .htaccess archivo, el predeterminado es todo lo que necesita. Debería estar en la raíz de su instalación de Codeigniter, ci/.htaccess:

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

En este punto https://example.com/hotel/ci/register mostrará la página Codeigniter 404. Si tiene activado el registro (consulte config/config.php), y observa el archivo de registro, verá por qué:

ERROR - 2017-11-14 17:57:20 --> 404 Page Not Found: Hotel/ci

Y aquí está la raíz de todo el problema. Dado que la redirección inicial es una interno redirigir (significa que la URL que se muestra en el navegador no cambia), el URI que Codeigniter recibe para procesar es el que aún se muestra en la barra de direcciones del navegador: hotel/ci/register. Codeigniter intentará manejar una solicitud como esa de 2 maneras:

  • Busque una ruta coincidente en application/config/routes.php

  • O busque un controlador llamado application/controllers/Hotel.phpcon un método llamado ci;

En nuestro caso no hay Hotel controlador, y no hay ruta para describir cómo manejar tal solicitud, así que boom, 404.

Una solución simple es crear una ruta para manejar esta solicitud:

$route['hotel/ci/register'] = 'register/index';

Y ahora https://example.com/hotel/ci/register ¡obras!

Notas:

  • Configuración de su ruta predeterminada para register ($route['default_controller'] = 'register';) significa que https://example.com/ci/ también mostrará el registro. No estoy seguro si quieres eso? Es posible que tenga problemas de SEO de contenido duplicado si esa URL muestra lo mismo que https://example.com/hotel/ci/registerasí que tal vez quieras algo más, o un 404, allí.

  • Asegúrese de quitar su $route['404_override'] = 'register'; ruta;

  • CI base_url no es relevante para este problema, aunque obviamente debe establecerse. Dependiendo de cómo quieras que sean tus enlaces, creo que http://example.com/ci/ o http://example.com/hotel/ci/ sería correcto

  • No estoy muy seguro de cuál es el propósito de esta condición en su CI .htaccess es para:

    RewriteCond $1 !^(index\.php|resources|robots\.txt)
    

    Las condiciones predeterminadas existentes ya omiten archivos y directorios que existen en el disco. eso es lo que !-f y !-d las condiciones significan: “si el patrón solicitado no coincide con un archivo o directorio en el disco, realice la redirección”.

    Si tienes un robots.txt archivo en disco (en su ci/ dir), y alguien solicita https://example.com/ci/robots.txtla !-f la condición fallará y se omitirá la reescritura, lo que significa que la solicitud se maneja sin reescrituras y robots.txt se devuelve con éxito. Igual por index.php. Si tienes un directorio llamado ci/resourcesy alguien pide https://example.com/ci/resourcesla !-d la condición fallará, la redirección se omitirá y la solicitud se realizará correctamente.

    no estoy seguro de tu resources parte, pero tal vez puedas eliminar esa condición por completo.

  • Si no necesita bonitas URL de Codeigniter (me refiero a otras que no sean https://example.com/hotel/ci/registereste cambio no lo afectará), y resulta que no necesita esa condición adicional anterior, puede deshacerse del CI .htaccess completamente para simplificar las cosas. Para hacer eso, simplemente cambie el WordPress RewriteRule a la versión no bonita:

    RewriteRule ^hotel/ci/register /ci/index.php/register [L]
    

    Y elimine su CI .htacces.

  • Lo explicaste de mejor manera. Acabo de usar Enrutamiento. $ruta[‘hotel/ci/register’] = ‘registrarse’; He eliminado index.php de CI. Acabo de usar Enrutamiento. Significa que el enrutamiento de URI de codeigniter y la regla de reescritura en htaccess fueron el problema principal en mi pregunta. Ya esta solucionado. Gracias

    – Pawan Thakur

    15 de noviembre de 2017 a las 4:54

Creo que estás en el camino correcto, prueba esto:

# BEGIN WordPress
   <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^/hotel/ci(/.*)?$ /ci/$1 [L]  # remove the register part 
                                              # so that it would be handled by CI
                                              # also remove the "?" in front of hotel
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
# END WordPress

mantenga su CI htaccess como está:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA] 
</IfModule>

la última parte es coincidir con su CI config.php a su nuevo modelo de URL

$config['base_url'] = "http://example.com/hotel/ci/";

  • Eliminé el registro de $ ruta[‘404_override’] = ‘registrarse’;

    – Pawan Thakur

    2 de noviembre de 2017 a las 9:05

  • hmmm… eso es bastante extraño, no veo ningún problema con su htaccess además del punto anterior, y no tengo un entorno de prueba por ahora, así que no puedo probarlo

    – am05mhz

    2 de noviembre de 2017 a las 9:23

avatar de usuario
Yaseen Ahmad

No creo que esta sea la gran respuesta a su pregunta, pero si me enfrento al mismo problema, usaré routes ver el código de ejemplo.

$route['(:any)/ci/register']  = "register";

¿Qué hará el código anterior? (:any) significa cualquier palabra en el primer uri y después de eso puedes definir cualquier url que quieras que defina ci/register también puedes hacerlo así.

$route['(:any)/register']  = "here_you_can_add_your_controller/function";

esto funcionará si presionas una URL como esta.

http://www.example.com/any_word_you_want/register

golpeará la función de su controlador. necesitas echo algo y se mostrará en su navegador.

también puede definir el hotel palabra en su url base como @ am05mhz muestra en su respuesta, pero no creo que sea una gran idea porque en el futuro puede tener 2 palabras más en su url.

Nota : el ejemplo de código anterior solo funciona si su .htaccess dar acceso a las rutas como muestra en su pregunta el .htaccess es trabajo para ti. Para un conocimiento completo de las rutas, consulte la documentación de enrutamiento de URI de codeigniter

  • Agregué tu $ruta[‘(:any)/ci/register’] = “registrarse”; Si elimino $ ruta[‘404_override’] = ‘registrarse’; a $ruta[‘404_override’] = ”; luego muestra 404 de CI. Significa tu $ruta[‘(:any)/ci/register’] = “registrarse”; y el mio $ruta[‘default_controller’] = ‘registrarse’; son iguales, ambos mostrarán 404 si no asigno $ ruta[‘404_override’] = ‘registrarse’;

    – Pawan Thakur

    13 de noviembre de 2017 a las 6:38

  • en su código cuando index.php no define la URL raíz, entonces muestra 404 y configura su controlador como error 404. sí, está en sus rutas, pero solo detecta las rutas de error. si desea lograr esto, debe colocar codeigniter en esta ruta public_html --> hotel --> and_here_your_codeigniter entonces funcionará, de lo contrario no puedes hacer eso. no estoy seguro de tu .htaccess si se le da acceso a su controlador, entonces las rutas anteriores funcionan al 100% para usted.

    – Yaseen Ahmad

    13 de noviembre de 2017 a las 6:47


  • si coloca codeigniter en su carpeta html pública, también las rutas anteriores funcionarán para usted.

    – Yaseen Ahmad

    13 de noviembre de 2017 a las 6:54

  • Lo siento, no puedo poner mi codeigniter en esta carpeta “hotel” porque es una página en wordpress. estas diciendo lo mismo?

    – Pawan Thakur

    13 de noviembre de 2017 a las 7:08


  • crea una nueva carpeta en html público si solo desea ver el hotel en la url si está mezclando WordPress y codeigineter, entonces no es posible

    – Yaseen Ahmad

    13 de noviembre de 2017 a las 7:29

Usar htaccess [P] bandera en su lugar.

Asegúrese de que la cadena sustituta (objetivo) comience con http://. De lo contrario, tratará la cadena sustituta como una ruta de archivo interna.

Verifique el código a continuación.

# BEGIN WordPress
   <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteRule ^/?hotel/ci/(.*)?$ http://example.com/ci/$1 [P]

    # If you want rewrite any URI as long it has */ci/* in it. 
    # Use the following rule instead.
    # RewriteRule ^(.*)/ci/(.*)?$ http://example.com/ci/$1 [P]

    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
# END WordPress

Además, no necesita actualizar la URL base de CI. La cadena vacía servirá.

$config['base_url'] = '';

Espero que ayude.

Enlaces:
https://httpd.apache.org/docs/current/rewrite/flags.html#flag_p

¿Ha sido útil esta solución?