Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Убрать из строки "index.php/"
Форумы портала PHP.SU » PHP » Регулярные выражения » Убрать из строки "index.php/"

Страниц (1): [1]
 

1. Vinyl - 23 Апреля, 2013 - 11:17:20 - перейти к сообщению
Всех приветствую.
Я тут рядом не дождался ответа, спрошу тут =)

Нужно написать регулярочку, чтобы вырезать из URI "index.php/".
Например, набираем "http://php.su/index.php/main/index", а нас редиректит на "http://php.su/main/index". С регулярками я особо не в друзьях, но кое-что составил:
CODE (htaccess):
скопировать код в буфер обмена
  1. RewriteEngine On
  2. RewriteBase /
  3.  
  4. //если URI подходит под шаблон
  5. RewriteCond %{REQUEST_URI} ^\/index\.php\/.*$
  6.  
  7. //переадресовываем.
  8. RewriteRule ^index\.php\/(.*)$ /$1 [NS,R=301,L]
  9.  
  10.  
  11.  
  12. //все, что ниже, нужно CodeIgniter'у
  13. RewriteCond %{REQUEST_FILENAME} !-f
  14. RewriteCond %{REQUEST_FILENAME} !-d
  15. RewriteRule ^(.*)$ index.php/$1 [L]
  16.  



Не работает.
RewriteRule ^index\.php - так бесконечный цикл,
RewriteRule ^\/index\.php - так не срабатывает на index.php

Пробовал в RewriteRule и с [NS] и без него.

rewrite_log (Отобразить)


Насколько я понимаю, апач к переадресованному запросу /main/index применяет правило RewriteRule ^(.*)$ index.php/$1 [L], после чего применяет моё правило, о чем свидетельствует строка RewriteCond: input='/index.php/main/index' pattern='^\/index\.php\/.*$' => matched, хотя он этого делать не должен, т.к. стоит флаг last.

В общем, вторые сутки кипит мой мозг, товарищи.
Где я накосячил? Спасибо заранее.
2. DelphinPRO - 23 Апреля, 2013 - 11:27:31 - перейти к сообщению
вариант разбора урла самим движком и при наличии в нем index.php - редиректить с 301 кодом - не вариант?
3. Vinyl - 23 Апреля, 2013 - 11:53:55 - перейти к сообщению
Хотелось бы через mod_rewrite.
4. DelphinPRO - 23 Апреля, 2013 - 11:59:22 - перейти к сообщению
мне бы тоже Улыбка
но я решал такую же проблему так как описывал выше )

не знаю, ведь если подумать, то мы все запросы редиректим на index.php. Правильно? Правильно. А если мы и с index.php будем редиректить на index.php, то получим замкнутый круг. Правильно? Правильно. Наверное.
Выходит задача мод-реврайтом нерешаемая...
5. Vinyl - 23 Апреля, 2013 - 12:00:40 - перейти к сообщению
Все, решил! Вдруг кому пригодится:
CODE (htaccess):
скопировать код в буфер обмена
  1. RewriteEngine On
  2. RewriteBase /
  3.  
  4. RewriteCond %{REQUEST_URI} ^\/index\.php\/.*$
  5. RewriteRule ^index\.php\/(.*)$ /$1 [NS,R=301,L]
  6.  
  7. RewriteCond %{REQUEST_FILENAME} !-f
  8. RewriteCond %{REQUEST_FILENAME} !-d
  9. RewriteRule ^(.*)$ index.php?/$1 [L]
  10.  

Разница в RewriteRule ^(.*)$ index.php?/$1 [L]
6. DelphinPRO - 23 Апреля, 2013 - 12:04:01 - перейти к сообщению
про нерешаемую задачу, я конечно же имел ввиду переадресацию адреса

site.ru/index.php на site.ru

с убиранием index.php из дргих адресов, прекрасно справляется стандартный код-игнайтеровский файлик
(Добавление)
Vinyl пишет:
Разница в RewriteRule ^(.*)$ index.php?/$1 [L]

а чем суть? не понимаю, что означает этот вопросик. как оно работает?
7. Vinyl - 23 Апреля, 2013 - 12:16:56 - перейти к сообщению
DelphinPRO пишет:
не понимаю, что означает этот вопросик


Я так понимаю, для самого движка нет разницы, есть вопр. знак, или нет, REQUEST_URI в обоих случаях одинакова, а вот под регулярку ^\/index\.php\/.*$ такая строка уже не попадает, поэтому редирект происходит один раз, а не бесконечно. Но это лишь мои предположения, а я так счастлив, что проверять их совсем нет желания Пляшу от радости
8. DelphinPRO - 23 Апреля, 2013 - 12:19:19 - перейти к сообщению
попробую вечером )
9. esterio - 23 Апреля, 2013 - 12:19:56 - перейти к сообщению
Я такие вещи люблю делать так
CODE (htaccess):
скопировать код в буфер обмена
  1. RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

Есть одно но - не можна пользоватся GET параметром route.
10. DelphinPRO - 23 Апреля, 2013 - 12:22:36 - перейти к сообщению
А! вот теперь, я понял! это ж строка запроса прибавляется к index.php
получается другой адрес, цикличности нет.
а я пару месяцев страдал проблемой. да уж..
11. Vinyl - 23 Апреля, 2013 - 12:22:58 - перейти к сообщению
esterio пишет:
Я такие вещу люблю делать так

Я тут не указал, забыл: используется CodeIgniter, посему ?route=$1 не подойдет.
12. esterio - 23 Апреля, 2013 - 12:26:05 - перейти к сообщению
жаль, из всего что я пробовал - ето лучше решение.
13. Vinyl - 23 Апреля, 2013 - 12:31:59 - перейти к сообщению
Вообще, странно, что этот момент не учтен на уровне фреймворка.
Если изначально не применять правил .htaccess, кроме тех, что нужны для работы ЧПУ, то по умолчанию по следующим адресам открывается одна и та же страница:

http://myhost[dot]com/
http://myhost[dot]com/index.php
http://myhost[dot]com/index.php/
http://myhost[dot]com/index.php/welcome
http://myhost[dot]com/index.php/welcome/
http://myhost[dot]com/index.php/welcome/index
http://myhost[dot]com/index.php/welcome/index/
http://myhost[dot]com/welcome
http://myhost[dot]com/welcome/
http://myhost[dot]com/welcome/index
http://myhost[dot]com/welcome/index/

По-моему, это перебор) Хотя, на то он, наверное, и фреймворк.

________________________________ __________________

Не одно, так другое. Пытаюсь убрать www:
CODE (htaccess):
скопировать код в буфер обмена
  1.  
  2. RewriteCond %{HTTP_HOST} ^www\..*$
  3. RewriteRule ^www\.(.*)$ http://$1 [R=301,L]


rewrite_log (Отобразить)


Судя по логу, в HTTP_HOST вообще ничего не попадает. В чем может быть проблема?

P.S. Я знаю, что надо http://$1/%{REQUEST_URI}, пока не так важно. И HTTP_HOST с явным указанием адреса хоста (т.е., !^host.com) не интересно.

 

Powered by ExBB FM 1.0 RC1