2013-06-01 2 views
-1

У меня есть CodeIgniter проект в папке b1 в моем public_html папку:Can 2 .htaccess файлы блокировать URL переписывания

mydomain.com/b1/controller/function 

Я хочу изменить его на:

mydomain.com/controller/function 

в строке браузера используя 301 перенаправление.

Мой файл .htaccess в моем public_html есть:

RewriteEngine on 
RewriteRule ^b1/(.*)$ /$1 [R=301,L,NC] 
RewriteRule ^(.*)$ b1/$1 

EXPLANATION: 

RewriteRule ^b1/(.*)$ /$1 [R=301,L,NC] # THIS IS TO REWRITE ALL REQUESTS FROM THE NAVBAR IN MY PROJECT WHICH HAVE THE FORM mydomain.com/b1/controller/function TO mydomain.com/controller/function. AFTER THIS THE NAVBAR SHOULD SHOW mydomain.com/controller/function (I ASSUME) 

RewriteRule ^(.*)$ b1/$1 # THIS IS TO TAKE ALL INCOMING REQUESTS AND ADD A b1 IN FRONT SO mydomain.com/controller/function IS REDIRECTED TO mydomain.com/b1/controller/function - BUT INTERNALLY, SO THAT THE BROWSERS ADDRESS BAR STILL SHOWS A 'PRETTIER' mydomain.com/controller/function 

Согласно http://htaccess.madewithlove.be/, это должно работать, но я все еще вижу:

mydomain.com/b1/controller/function 

в моей адресной строке.

Обратите внимание, что это проект codeigniter, а CI имеет следующий файл .htaccess. (Опять же проект находится в моем public_html директории/b1)

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* index.php/$0 [PT,L] 

Насколько я могу сказать, mod_rewrite работает, потому что RewriteRule^(. *) $ B1/$ 1 работ, когда матч к правилу над ним не происходят.

Возможно, некоторая комбинация файлов с 2-х х х х кэшем вызывает отсутствие видимой перезаписи в адресной строке? Я хотел бы отладить это и выяснить, как достичь формата URL, рассмотренного выше.

Спасибо,

Билл

Дополнение: благодаря всем для своих попыток. то, что я замечаю из нескольких ответов, заключается в следующем:

RewriteRule ^b1/(.*)$ /$1 [R=301,L,NC] 
RewriteRule ^(.*)$ b1/$1 [L] 

Их, кажется, много L-флагов. В псевдокоде, что я хочу достичь, это:

IF REQUEST is mydomain.com or www.mydomain.com (with nothing after the /) rewrite to mydomain.com . FIRST REWRITE TO REMOVE B1 IF EXISTS (this is for the navbar requests which have form: mydomain.com/b1/controller/function which should be rewritten to mydomain.com/controller/function) so that the address bar shows mydomain.com/controller/function 

если Theres в L выше, я не думаю, что он будет работать

Then add b1 back in internally so you redirect to b1 folder where project is stored 
+0

Помещенные 'RewriteOptions inherit' в верхней части нижнего уровня' .htaccess' файл. –

+0

это вызывает ошибку сервера 500 – user61629

+0

Опасность угадывания: 'RewriteRule. * Index.php/$ 0 [PT, L]', 'L' означает: не обрабатывать никаких дополнительных правил (и« более глубокий ».htaccess работает до тот, который находится в вашем документе root). Не могли бы вы попробовать без этого 'L'? – Wrikken

ответ

0

Для 301 использования редиректа Перенаправление в файле .htaccess:

Redirect 301 /redirect_from http://www.mydomain.com/redirect_to 
+0

mixkorshun, имеет ли этот подход компонент регулярного выражения? Мне нужно, чтобы – user61629

0

Почему вы используете его в подпапке b1, если хотите, чтобы он функционировал как основной проект в домене?

+0

Furqan, 2 причины: 1) Я прочитал, что для обеспечения безопасности ваш проект за пределами public_html-каталога по соображениям безопасности, поэтому я поместил свой проект за пределы и символизировал его в папку b1.2) Мой основной проект находится в b1, но у меня есть другое добавление в доменах, у которых есть свои собственные папки в каталоге public_html – user61629

+0

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

2

Ваша проблема с двумя .htaccess файлами, которые вы используете. При использовании .htaccess он будет использовать файл, ближайший к запрашиваемой папке. В вашем случае вы имеете следующую структуру папок

- public_html 
    - B1 
    - .htaccess //from codeigniter project 
    .htaccess //your own with redirect 

Итак, когда вы вызываете URL mydomain.com/b1/controller/function ближайший .htaccess он может найти это CodeIgniter один, так что он будет использовать этот. Ваш собственный файл не будет использоваться. Другими словами, правила переадресации никогда не оцениваются.

Если вы звоните, mydomain.com/controller/function ближайший .htaccess, то ваш перенаправительник отправлен в mydomain.com/b1/controller/function, как ожидалось. Там он снова попытается найти ближайший .htaccess, который является codeigniter, и, таким образом, запрос работает.

Есть две вещи, которые вы можете сделать. Первое и самое лучшее - удалить .htaccess и скопировать все файлы и папки из папки b1 обратно в папку public_html, а затем просто удалить папку b1. Таким образом, ваш сервер даже не имеет папки b1, и все будет работать так, как ожидалось.

Второй вариант - объединить два файла .htaccess и сохранить их в папке public_html. Убедитесь, что вы удалили его в папке b1. Файл будет выглядеть примерно так

RewriteEngine on 

RewriteRule ^b1/(.*)$ /$1 [R=301,L,NC] 

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

По нескольким причинам, я думаю, что ваш второй вариант - это то, что я хочу преследовать. Я удалил файл CI .htacess и добавил ваш, но теперь он показывает мне каталог для public_html – user61629

+0

, который обновил последнюю строку. Может быть, ваш сервер требует/перед последним b1, если он все еще не работает. –

+0

Я попробовал вашу новую обновленную версию с правилом rewrite как RewriteRule^(. *) $ B1/index.php/$ 1 [L] и RewriteRule^(. *) $ /b1/index.php/$1 [L]. В обоих случаях я просто вижу каталог mydomain.com – user61629

0

Самый простой способ добиться того, что вы пытаетесь сделать, это переместить файл CodeIgniter в index.php в папку public_html/ и обновить $system_folder и $application_folder пути, чтобы указать папку b1/. Пример ниже:

/public_html/index.php

/* 
*--------------------------------------------------------------- 
* SYSTEM FOLDER NAME 
*--------------------------------------------------------------- 
* 
* This variable must contain the name of your "system" folder. 
* Include the path if the folder is not in the same directory 
* as this file. 
* 
*/ 
$system_path = 'b1/system'; 

/* 
*--------------------------------------------------------------- 
* APPLICATION FOLDER NAME 
*--------------------------------------------------------------- 
* 
* If you want this front controller to use a different "application" 
* folder then the default one you can set its name here. The folder 
* can also be renamed or relocated anywhere on your server. If 
* you do, use a full server path. For more info please see the user guide: 
* http://codeigniter.com/user_guide/general/managing_apps.html 
* 
* NO TRAILING SLASH! 
* 
*/ 
$application_folder = 'b1/application'; 

Это «внутри» сказать CodeIgniter, что все ваши вещи приложение находится в папке b1/, но с точки зрения конечного пользователя, ваши домены будут по-прежнему выглядеть mydomain.com/controller/function

Ваш файл .htaccess будет выглядеть следующим образом:

/public_html/.htaccess

RewriteEngine on 
RewriteBase/

# redirect any actual requests for your b1 folder 
# back to the web root 
RewriteRule ^b1/(.*)$ /$1 [R=301,L,NC] 

# remove index.php from the url 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 

Вы не должны, то есть необходимость для .htaccess файла в папке b1.

+0

Я действительно пробовал это, но в этом конкретном случае проект вымощен булыжником таким образом, что многие пути были нарушены, когда я переместил файл index.php в public_html. Таким образом, лучшим решением в этом случае является совместное сохранение проекта в текущей конфигурации – user61629

1

Моя попытка:

RewriteEngine on 
RewriteBase/

RewriteCond %{ENV:REDIRECT_STATUS} !200 
RewriteRule ^b1/(.*)$ /$1 [R=301,L,NC] 

RewriteRule ^(.*)$ b1/$1 [L] 
+0

, это передает доменное имя mydomain.com в папку mydomain.com/b1 просто отлично, но запросы, созданные с помощью codeigniter Navbar в форме mydomain.com/ b1/controller/function не переписаны в mydomain.com/controller/function. Я заменил файл CI .htacess, должен ли я его вынуть? – user61629

+0

Странно. Попробуйте удалить флаг «PT». – Gerben

+0

какой флаг PT? Я не вижу этого выше. Кроме того, я снова заменил файл CI .htacess, я должен его вынуть, т. Е. 1 файл htacess или 2? – user61629

Смежные вопросы