Проблем с .htaccess

teroristd

Registered
Здравейте, ако темата не е за този раздел моля да ме извините. Направих за един приятел малък онлайн магазин (не е готова система). На локалния хост всичко си работи. Дойде време да го пуснем и взехме линукс хостинг от icn (не е реклама). Проблема е че .htaccess-а нещо не работи. Той е за премахване на index.php от url-a. Слагах го и в public_html директорията, където е index.php и в основната, резултат няма.

Пример http://www.site.com/index.php/about - така работи
http://www.site.com/about - така не работи

Ето .htaccess-a
Код:
RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule ^(.*)$ index.php/$1 [L]
 
Код:
# Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
 
teroristd каза:
Така също не работи. Да добавя че излиза и съобщение No input file specified.
А само така:
Код:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
 
Я виж с
PHP:
<?php
    phpinfo();
  ?>
дали на хостинга ти mod_rewrite e enabled и пробвай така:
Код:
<IfModule mod_rewrite.c>

    RewriteEngine On
    RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
 
Мод-а си е включен. Намерих някакво инфо за проблема но не знам каво да правя.

Based on your .htaccess file, it seems that your CMS expects the URL to passed along as a PATH_INFO variable. CGI and FastCGI implementations do not have PATH_INFO available, so when trying to pass the URI along, PHP fails with that message.
 
Това примерно:

Код:
RewriteBase /
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]

Ползваш ли някакъв framework?
 
teroristd каза:
Мод-а си е включен. Намерих някакво инфо за проблема но не знам каво да правя.

Based on your .htaccess file, it seems that your CMS expects the URL to passed along as a PATH_INFO variable. CGI and FastCGI implementations do not have PATH_INFO available, so when trying to pass the URI along, PHP fails with that message.
Изчисти си кеша на браузъра ако трябва.
Код:
RewriteEngine on
#1) redirect the client from "/index.php/foo/bar" to "/foo/bar"
RewriteCond %{THE_REQUEST} /index\.php/(.+)\sHTTP [NC]
RewriteRule ^ /%1 [NE,L,R]
#2)internally map "/foo/bar" to "/index.php/foo/bar"
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ /index.php/$1 [L]
 
Не става и по двата начина. Чистих и кеша пак не става. Ползвам си моя система и при мен си работи. Лошото е че настройките на сървъра са различни и това причинява проблема.
 
Намирисва ми на nginx :D За разлика от apache, nginx не работи с htaccess файлове.
 
Ох не знам какво е ама е много дървена работа. Сега тия от хостинга нещо гледат, ама едва ли ще го оправят :( . Май няма да има pretty url-s.
 
teroristd каза:
Ох не знам какво е ама е много дървена работа. Сега тия от хостинга нещо гледат, ама едва ли ще го оправят :( . Май няма да има pretty url-s.
Странна работа. Още мъдря по темата ама не се сещам някакъв друг начин да презапишеш url-то.
 
Да ето така си взимам урл-а.

PHP:
public function getUrl()
    {
        return substr(filter_input(INPUT_SERVER, 'PHP_SELF'), strlen(filter_input(INPUT_SERVER, 'SCRIPT_NAME')) + 1);
    }

След това в FrontControler си правя разни проверки и накрая разбивам урл-а и си взимам контролера и т.н.

PHP:
private function params()
    {
        $this->_params = explode('/', $this->_URL);

        if (!empty($this->_params[0]))
        {
            $this->_controller = strtolower($this->_params[0]);

            $this->isControllerExist();

            if (!empty($this->_params[1]))
            {
                $this->_method = strtolower($this->_params[1]);

                $this->isMethodExist();

                unset($this->_params[0], $this->_params[1]);
            }
            else
            {
                $this->_method = strtolower($this->_defaultParam[1]);
            }
        }
        else
        {
            $this->_controller = strtolower($this->_defaultParam[0]);

            $this->_method = strtolower($this->_defaultParam[1]);
        }

        $this->_file = $this->_namespace . DIRECTORY_SEPARATOR . ucfirst($this->_controller);

        $this->_load = $this->_container->make($this->_file);

        $this->_load->{$this->_method}();
[/code]
 
Ето и част от коментара на съпрта, но както се досещате проблема си остава.
Здравейте,
споделения хостинг не работи с mod_php както сте предположили а със cgi вариация, но не е това проблема. При cgi има функция cgi_fixpathinfo, която заобикаля описания от Вас проблем, но тя е настроена от нас коректно на всеки сървър.
 
teroristd каза:
Ето и част от коментара на съпрта, но както се досещате проблема си остава.
Здравейте,
споделения хостинг не работи с mod_php както сте предположили а със cgi вариация, но не е това проблема. При cgi има функция cgi_fixpathinfo, която заобикаля описания от Вас проблем, но тя е настроена от нас коректно на всеки сървър.

Пробва ли с прости функциии, които htaccess да стартира? Примерно да не ти дава достъп до някоя папка и да ти иска парола. Ако го прави то проблема е някъде при презаписването на урл-тата, а не като цуло че htaccess не работи.
 
Не не съм пробвал други функции. Той самия .htaccess работи но не както се очаква. Според мен е от настройките на сървъра защото на локалхоста си работи. Аз съм склонен да променя нещо по моя код но не знам какво.
 
Проблема идва именно заради това, което са ти написали. cgi.fixpathinfo. Така или иначе няма да го фикснат за теб, нито ти можеш да го фикснеш на споделен хостинг.
Това, което можеш да направиш е следното:

.htaccess
Код:
RewriteEngine On

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

index.php
Код:
echo $_SERVER['REQUEST_URI'];

Пример: http://example.com/controller/action, би трябвало да ти върне това в червено.
 
Такъв ми е оригиналния .htaccess без питанката. С нея също пробвах но само изчезва съобщението No input file specified. и не ми зарежда нищо.
 

Горе