2017-10-17 6 views
18

J'ai installé WordPress dans example.com. J'ai également installé CodeIgniter dans le dossier ci ici example.com/ci/, ci est le nom du dossier, register est le nom du contrôleur et l'URL de travail de CI est example.com/ci/register. Mon URL de base commence par https: //.Règle de réécriture Wordpress et CI dans htaccess

Maintenant, j'ai un URL WordPress example.com/hotel, hotel est la page que j'ai créé dans WordPress admin, ça fonctionne très bien.

Je veux exécuter mon chemin de CI comme example.com/hotel/ci/register, je pense que nous pouvons le faire avec une règle de réécriture afin que mon URL ressemble à example.com/hotel/ci/register. J'ai ajouté donné htaccess pour wordpress que me rediriger ici example.com/hotel/ci/register. Il me montre 404 error de CI. Cela signifie maintenant que je suis en CI. Maintenant, j'ai fait les choses suivantes dans le fichier routes.php.

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

Maintenant cette URL example.com/hotel/ci/register fonctionne, mais ce n'est pas la bonne façon, la prochaine fois, il y aura plus de contrôleurs, alors il ne fonctionnera pas.

Remarque: Je ne peux pas créer le dossier hotel car l'hôtel est une page dans WordPress. Si je crée le dossier hotel alors l'URL de WordPress example.com/hotel/ ne fonctionnera pas. Il redirigera la page WordPress vers le dossier hotel. Donc je dois le faire sans créer le dossier hotel. Notez example.com = myurl.com.

J'ai besoin de trouver une autre bonne solution. Tout conseil ou conseil serait grandement apprécié?

Suite est ma règle de réécriture dans 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 

Et voici mon 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> 
+0

Déposez votre dossier '' ci' .htaccess' –

+0

Avez-vous changé les '' base_url' dans le fichier config.php' pour correspondre au nouveau chemin d'URL? – am05mhz

+0

Ceci est l'URL http://example.com/ci/ –

Répondre

5

Problème intéressant! J'ai mis en place un conteneur Docker avec une nouvelle installation de Wordpress et Codeigniter, j'ai créé une page hotel dans WP, et un contrôleur Register et voir dans CI, et j'ai testé. J'ai passé trop de temps là-dessus, mais j'ai trouvé une réponse.

D'abord, votre Wordpress .htaccess. Comme @tobiv l'a souligné dans un commentaire, vous ne devriez rien ajouter entre les commentaires BEGIN/END WordPress car il pourrait être bloqué par une mise à jour WP. Votre redirection doit venir avant les règles WP standard, donc ajouter au haut du fichier:

<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> et RewriteEngine On sont dupliquées qui semble compliqué, mais vous avez besoin d'eux, comme nouveau La règle doit aller en premier pour traiter la requête avant que les règles WP ne le fassent.

Vous n'avez pas besoin de modifier le fichier Codeigniter .htaccess, celui par défaut est tout ce dont vous avez besoin. Il devrait être à la racine de votre installation CodeIgniter, ci/.htaccess:

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

À ce stade https://example.com/hotel/ci/register affiche la page Codeigniter 404. Si vous avez activé la journalisation (voir config/config.php), et vous regardez le fichier journal, vous comprendrez pourquoi:

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

Et voici la racine du problème dans son ensemble. Comme la redirection initiale est une redirection interne (signifie que l'URL affichée dans le navigateur ne change pas), l'URI Codeigniter reçoit pour traiter est celui toujours affiché dans la barre d'adresse du navigateur - hotel/ci/register.CodeIgniter va essayer de traiter une requête comme celle de 2 façons:

  • Rechercher un itinéraire correspondant à application/config/routes.php

  • Ou chercher un contrôleur nommé application/controllers/Hotel.php, avec une méthode appelée ci;

Dans notre cas, il n'y a pas de contrôleur Hotel, et aucun itinéraire pour décrire comment gérer une telle demande, si boum, 404.

Une solution simple est de créer un itinéraire pour gérer cette demande:

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

Et maintenant https://example.com/hotel/ci/register fonctionne!

Notes:

  • Réglage de votre route par défaut à register ($route['default_controller'] = 'register';) signifie que https://example.com/ci/ montrera également registre. Je ne suis pas sûr si tu veux ça? Vous pourriez rencontrer des problèmes de SEO en double si cette URL affiche la même chose que https://example.com/hotel/ci/register, alors peut-être que vous voulez quelque chose d'autre, ou un 404, là.

  • Assurez-vous de supprimer votre route $route['404_override'] = 'register';;

  • CI n'est pas pertinent pour ce problème, mais doit évidemment être défini. Selon la façon dont vous voulez que vos liens soient, je pense que soit http://example.com/ci/ ou http://example.com/hotel/ci/ aurait raison.

  • Je ne suis pas tout à fait sûr de ce que le but de cette condition dans votre CI .htaccess est pour:

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

    Les conditions par défaut existantes sauter déjà des fichiers et des répertoires qui existent sur le disque. C'est ce que signifient les conditions !-f et !-d - "si le modèle demandé ne correspond pas à un fichier ou à un répertoire sur le disque, alors faites la redirection".

    Si vous avez un fichier robots.txt sur le disque (dans votre ci/ dir), et quelqu'un demande des https://example.com/ci/robots.txt, la condition !-f échouera et la réécriture est sautée - qui signifie que la demande est traitée sans réécritures et robots.txt est retourné avec succès. Idem pour index.php. Si vous avez un répertoire appelé ci/resources et que quelqu'un demande https://example.com/ci/resources, la condition !-d échoue, la redirection est ignorée et la requête réussie.

    Je ne suis pas sûr de votre pièce resources, mais peut-être que vous pouvez supprimer complètement cette condition. Si vous n'avez pas besoin de jolies URL Codeigniter (je veux dire autre que https://example.com/hotel/ci/register, ce changement ne l'affectera pas), et il se trouve que vous n'avez pas besoin de cette condition supplémentaire ci-dessus, vous pouvez vous débarrasser de la CI .htaccess complètement pour simplifier les choses.Pour ce faire, il suffit de changer le Wordpress RewriteRule à la version non-jolie:

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

    Et supprimer votre CI .htacces.

+0

Vous l'avez expliqué de meilleure façon. Je viens d'utiliser Routing. $ route ['hotel/ci/register'] = 'enregistrer'; J'ai supprimé index.php de CI. Je viens d'utiliser Routing. Moyens codeigniter routage URI et règle de réécriture dans htaccess étaient le principal problème dans ma question. C'est résolu maintenant. Merci –

2

Je pense que vous êtes sur la bonne voie, essayez ceci:

# 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 

Gardez votre CI htaccess tel quel:

<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 dernière partie est correspondent à votre CI config.php à votre nouveau modèle url

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

J'ai fait pareil mais il m'a montré 404 de wordpress –

+0

J'ai enlevé le registre de $ route ['404_override'] = 'register'; –

+0

hmmm .. c'est calme bizarre, je ne vois pas de problème avec votre htaccess à côté du point ci-dessus, et je n'ai pas d'environnement de test pour l'instant, donc je ne peux pas le tester – am05mhz

1

Utilisez htaccess [P] drapeau à la place.

Assurez-vous que la chaîne de substitution (cible) commence par http://. Sinon, il traitera la chaîne de substitution comme un chemin de fichier interne.

Vérifiez le code ci-dessous.

# 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 

De même, vous n'avez pas besoin de mettre à jour l'URL de base de CI. Chaîne vide fera l'affaire.

$config['base_url'] = ''; 

Espérons que cela aide.

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

+0

Affichage de moi erreur suivante: Erreur interne du serveur Le serveur a rencontré une erreur interne ou une mauvaise configuration et n'a pas pu terminer votre demande. Veuillez contacter l'administrateur du serveur à l'adresse [email protected] pour les informer du moment où cette erreur s'est produite et des actions que vous avez effectuées juste avant cette erreur. Plus d'informations sur cette erreur peuvent être disponibles dans le journal des erreurs du serveur. En outre, une erreur 500 Internal Server Error a été rencontrée lors de la tentative d'utilisation d'un ErrorDocument pour gérer la demande. –

+0

J'utilise https: // –

+0

Je vois ... C'est un problème "SSL Proxy". Ajoutez ** SSLProxyEngine sur ** à l'intérieur de votre '' qui corrigera. Sinon, ajoutez ces directives (visitez le lien): https://stackoverflow.com/a/22069646/959060 –

2

Je ne chose que ce sera la grande réponse de votre question, mais si je fais face au même problème je vais utiliser routes voir le code exemple.

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

quel sera le code ci-dessus ne (:any) signifie un mot dans le premier uri et après que vous pouvez définir une URL que vous voulez que je vous ci/register défini aussi le faire comme ça.

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

cela fonctionnera si vous tapez cette URL.

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

it will hit your controller function. you need to echo something and it will show in your browser.

vous pouvez également définir l'hôtel mot dans votre url de base comme @ am05mhz montre dans sa réponse mais je ne chose qui est une excellente idée, car à l'avenir Puissiez-vous avoir 2 plus de mots dans votre URL.

Note: l'exemple de code ci-dessus ne fonctionne que si votre .htaccess donnera accès à des déroutes comme vous montre dans votre question est le .htaccess travail pour vous. Pour une pleine connaissance des déroutes s'il vous plaît vérifier la documentation de codeigniter URI routing

+0

J'ai ajouté votre $ route ['(: any)/ci/register'] = "registre"; Si je supprime $ route ['404_override'] = 'register'; à $ route ['404_override'] = ''; alors il montre 404 de CI. Cela signifie que $ route ['(: any)/ci/register'] = "registre"; et mine $ route ['default_controller'] = 'registre'; sont même les deux montreront 404 si je ne donne pas $ route ['404_override'] = 'register'; –

+0

dans votre code lorsque index.php undefined l'URL racine puis il montre 404 et vous définissez votre contrôleur comme erreur 404. oui c'est dans vos routines mais c'est seulement rattraper les erreurs de routage. Si vous voulez réaliser cela, vous devez placer codeigniter dans ce chemin 'public_html -> hotel -> and_here_your_codeigniter' alors cela fonctionnera sinon vous ne pouvez pas le faire. Je ne suis pas sûr de votre '.htaccess' si c'est donné pour accéder à votre contrôleur, alors les routeurs ci-dessus fonctionnent à 100% pour vous. –

+0

si vous placez codeigniter dans votre dossier html public alors aussi les routages ci-dessus fonctionneront pour vous. –