Подтвердить что ты не робот

Правила перезаписи Wordpress и CI в htaccess

Я установил WordPress в example.com. Я также установил CodeIgniter в папке ci здесь example.com/ci/, ci - это имя папки, register - имя контроллера, а рабочий URL-адрес CI - example.com/ci/register. Мой базовый URL начинается с https://.

Теперь у меня есть один URL-адрес WordPress example.com/hotel, hotel - это страница, которую я создал в администраторе WordPress, она отлично работает.

Я хочу запустить мой CI-путь, как example.com/hotel/ci/register, я думаю, мы можем сделать это с некоторым правилом перезаписи, чтобы мой URL-адрес выглядел бы как example.com/hotel/ci/register. Я добавил для htaccess, что перенаправляет меня сюда example.com/hotel/ci/register. Он показывает мне 404 error CI. Это означает, что я сейчас в КИ. Теперь я выполнил следующие действия в файле routes.php.

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

Теперь этот URL example.com/hotel/ci/register работает, но это не правильно, в следующий раз будет больше контроллеров, тогда он не будет работать.

Примечание. Я не могу создать папку hotel, потому что отель - это страница в WordPress. Если я создам папку hotel, то WordPress URL example.com/hotel/не будет работать. Он перенаправит страницу WordPress в папку hotel. Поэтому я должен сделать это, не создавая папку hotel. Примечание example.com = myurl.com.

Мне нужно найти еще одно хорошее решение. Было бы очень полезно посоветоваться или руководствоваться.

Следующее мое правило reWrite в 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

И вот мой 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>
4b9b3361

Ответ 1

Интересная проблема! Я создал контейнер Docker со свежей установкой Wordpress и Codeigniter, я создал страницу hotel в WP и контроллер Register и просмотр в CI и получил тестирование. Я потратил слишком много времени на это, но я нашел ответ.

Во-первых, ваш Wordpress .htaccess. Как отметил @tobiv в комментарии, вы не должны добавлять что-либо между комментариями BEGIN/END WordPress, поскольку он может быть взломан обновлением WP. Однако ваше перенаправление должно появиться перед стандартными правилами WP, поэтому добавьте его в файл top:

<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> и RewriteEngine On дублируются, что кажется беспорядочным, но вам это нужно, так как ваше новое правило должно идти первым, поэтому он обрабатывает запрос до того, как будут выполняться правила WP.

Вам не нужно изменять файл Codeigniter .htaccess, по умолчанию это все, что вам нужно. Он должен быть в корне вашей установки Codeigniter, ci/.htaccess:

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

В этот момент https://example.com/hotel/ci/register отобразится страница Codeigniter 404. Если вы включили ведение журнала (см. config/config.php), и вы смотрите файл журнала, вы увидите, почему:

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

И вот корень всей проблемы. Поскольку первоначальное перенаправление является внутренним перенаправлением (означает, что URL-адрес, отображаемый в браузере, не изменяется), URI Codeigniter получает для процесса, который все еще отображается в адресной строке браузера - hotel/ci/register. Codeigniter будет пытаться обрабатывать такой запрос двумя способами:

  • Найдите подходящий маршрут в application/config/routes.php

  • Или найдите контроллер с именем application/controllers/Hotel.php с помощью метода ci;

В нашем случае нет контроллера hotel и нет маршрута для описания того, как обрабатывать такой запрос, поэтому стрела, 404.

Одним простым решением является создание маршрута для обработки этого запроса:

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

А теперь https://example.com/hotel/ci/register работает!

Примечания:

  • Настройка маршрута по умолчанию на Register ($route['default_controller'] = 'register';) означает, что https://example.com/ci/ также будет показывать регистр. Я не уверен, хотите ли вы этого? Вы можете столкнуться с проблемами с дублирующимся содержанием SEO, если этот URL-адрес показывает то же самое, что и https://example.com/hotel/ci/register, поэтому, возможно, вам нужно что-то еще или 404.

  • Убедитесь, что вы удалите маршрут $route['404_override'] = 'register';;

  • CI base_url не относится к этой проблеме, хотя, очевидно, должно быть установлено. В зависимости от того, как вы хотите, чтобы ваши ссылки были, я думаю, что либо http://example.com/ci/, либо http://example.com/hotel/ci/ будет правильным.

  • Я не совсем уверен, какова цель этого условия в вашем CI .htaccess для:

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

    Существующие условия по умолчанию уже пропускают файлы и каталоги, которые существуют на диске. То, что означают условия !-f и !-d - "если запрошенный шаблон не соответствует файлу или каталогу на диске, тогда выполните перенаправление".

    Если у вас есть файл robots.txt на диске (в директории ci/), а кто-то запрашивает https://example.com/ci/robots.txt, условие !-f не будет выполнено, а переписывание будет пропущено - это означает, что запрос обрабатывается без перезаписи и robots.txt возвращается успешно. То же самое для index.php. Если у вас есть каталог с именем ci/resources, а кто-то запрашивает https://example.com/ci/resources, условие !-d не будет выполнено, перенаправление будет пропущено, и запрос будет успешным.

    Я не уверен в вашей части resources, но, возможно, вы можете полностью удалить это условие.

  • Если вам не нужны симпатичные URL-адреса Codeigniter (я имею в виду, кроме https://example.com/hotel/ci/register, это изменение не повлияет на это), и, оказывается, вам не нужно дополнительное условие выше, вы можете получить избавиться от CI .htaccess полностью, чтобы упростить вещи. Для этого просто измените Wordpress RewriteRule на недобрую версию:

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

    И удалите свой CI .htacces.

Ответ 2

Я думаю, что вы на правильном пути, попробуйте следующее:

# 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

сохранить свой 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>

последняя часть соответствует вашему CI config.php вашей новой модели URL.

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

Ответ 3

Я не уверен, что это будет отличный ответ на ваш вопрос, но если я столкнусь с той же проблемой, я буду использовать routes, чтобы увидеть пример кода.

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

что будет делать код выше (:any) означает любое слово в первом uri, и после этого вы можете определить любой URL-адрес, который вы хотите, я определил ci/register, вы также можете сделать это вот так.

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

это будет работать, если нажать URL-адрес, подобный этому.

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

он попадет в вашу функцию контроллера. вам нужно echo что-то, и оно будет отображаться в вашем браузере.

вы также можете определить слово hotel в своем базовом URL-адресе, как показывает @am05mhz, но я не знаю, что отличная идея, потому что в будущем у вас может быть еще 2 слова в вашем URL-адресе,

Примечание. приведенный выше пример кода работает только в том случае, если ваш .htaccess предоставляет доступ к маршрутам, как показано в вашем вопросе, .htaccess работает для вас. Для полного ознакомления с маршрутами, пожалуйста, проверьте документацию маршрутизация URI codeigniter

Ответ 4

Вместо этого используйте флаг htaccess [P].

Убедитесь, что строка substitute (target) начнется с http://. В противном случае он будет обрабатывать заменяющую строку как внутренний путь к файлу.

Проверьте код ниже.

# 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

Кроме того, вам не нужно обновлять базовый URL-адрес CI. Пустая строка будет делать.

$config['base_url'] = '';

Надеюсь, что это поможет.

Ссылки:
https://httpd.apache.org/docs/current/rewrite/flags.html#flag_p