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/register
creo 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>
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.php
con un método llamadoci
;
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 quehttps://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 quehttps://example.com/hotel/ci/register
así 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 quehttp://example.com/ci/
ohttp://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 suci/
dir), y alguien solicitahttps://example.com/ci/robots.txt
la!-f
la condición fallará y se omitirá la reescritura, lo que significa que la solicitud se maneja sin reescrituras yrobots.txt
se devuelve con éxito. Igual porindex.php
. Si tienes un directorio llamadoci/resources
y alguien pidehttps://example.com/ci/resources
la!-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/register
este 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 WordPressRewriteRule
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
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
Publica tu
ci
carpeta.htaccess
– Xpleria
27 de octubre de 2017 a las 12:54
has cambiado el
base_url
en elconfig.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