Linky odkazují na Not Found

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Giron
Člen | 13
+
0
-

EDIT: Problém vyřešen, způsobovali jej ty aliasy, zprvu mě nenapadlo, že by to mohl být problém. Bylo nutné povolit v .htaccess rewrite base a dopsat tam ten alias. Takže děkuji uživateli Pajka, měl pravdu, akorát já byl hloupý a nechat v rewrite base zprvu jen lomítko.

Pro ostatní s podobnými problémy zde uvádím odkaz na podobný problém: Apache aliasy

Dobrý den, používám PHP 5.3.5, Apache verze 2.2.17 (mod_rewrite povolen, respektive v httpd.conf je řádek LoadModule rewrite_module modules/mod_rewrite.so) a NetteFramework-2.0alpha-PHP5.3 (Používám wamp server). Jsem naprostý začátečník, který se rozhodl vyzkoušet PHP potažmo Nette. Zkusil jsem vytvořit jen jednoduché menu, které odkazuje na několik statických stránek (kromě uvedeného Contact i další, vytvořených naprosto stejně). Problém je, že po kliknutí na jakýkoliv odkaz KROMĚ Hlavní stránka se dostanu na klasickou stránku Not Found. Odkaz Hlavní stránka odkazuje na localhost:8080/aa/ (aa je alias v Apachi směřující do document_root) a to funguje a ostatní odkazy odkazují na localhost:8080/aa/contact nebo matches..a tyto linky nefungují. Napadá někoho, v čem by mohl být problém? Mám podezření na nějakou zákeřnost se servrem nebo mojí naprosto hloupou chybu. Snažil jsem něco podobného nalézt zde na fóru, ale moc to nepomohlo. Formu linků jsem zkoušel různě menit ({link Contact}, {link :Contact})Nyní uvedu relevantní informace:

  • /app/templates/@layout.phtml -zde se nachází mé menu s odkazy
  • /app/templates/Contact/default.phtml
  • /app/templates/Homepage/default.phtml
  • /app/presenters/BasePresenter.php
  • /app/presenters/HomepagePresenter.php -zde je funkce renderDefault()
  • /app/presenters/Contact.php -zde je funkce renderDefault()

V document_root i ledaskde jinde jsou .htaccess soubory zkopírované ze sandboxu.

Část mého @layout.phtml

<ul id="menu">
      <li {ifCurrent default}class="active"{/ifCurrent}><a href="{link Homepage:default}">Hlavní stránka</a></li>
      <li {ifCurrent team}class="active"{/ifCurrent}><a href="{link Team:default}">Sestava</a></li>
      <li {ifCurrent matches}class="active"{/ifCurrent}><a href="{link Matches:default}">Zápasy</a></li>
      <li {ifCurrent contact}class="active"{/ifCurrent}><a href="{link Contact:default}">Kontakt</a></li>
    </ul>

A nakonec část mého bootstrap.php:

$application->onStartup[] = function() use ($application) {
	$router = $application->getRouter();

	$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);

	$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
};

Budu vděčný za jakoukoliv radu.

Editoval Giron (17. 4. 2011 14:15)

Berry
Začátečník | 70
+
0
-

Mě to funguje takhle:

Menu v šabloně

<ul>
{foreach $menuItems as $id=>$item}
<li {ifCurrent $id}class="current"{/if}><a href="{plink $id}">{$item}</a></li>
{/foreach}
</ul>

a pak v BsePresenteru toto

abstract class BasePresenter extends Presenter
{
	public function beforeRender(){
		$this->template->menuItems = array
		(
		 'HomePage:'=>'Domů',
		 'Products:'=>'Produkty',
		 'Contact:'=>'Kontakty'
		 );
	}
	//prepínac zoabrazení šablon
	public $oldLayoutMode = FALSE;
}

Editoval Berry (16. 4. 2011 17:50)

Giron
Člen | 13
+
0
-

Děkuji za reakci, zkusil jsem to takto upravit (s nutnými úpravami pro mou verzi) a chyba stále stejná. Zdá se, že chyba možná opravdu bude někde v konfiguraci servru či .htaccess.....nevím. No zkusím to nějak vykoumat.

aannubis
Člen | 33
+
0
-

Máš na serveru povolený rewrite?

Giron
Člen | 13
+
0
-

aannubis napsal(a):

Máš na serveru povolený rewrite?

Viz. můj příspěvek, první věta ⇒ tučně zvýrazněné.

Pavel Kouřil
Člen | 128
+
0
-

A máš správně nastavený .htaccess? Možná zkus odkomentovat/zakomentovat RewriteBase?

Giron
Člen | 13
+
0
-

Pajka napsal(a):

A máš správně nastavený .htaccess? Možná zkus odkomentovat/zakomentovat RewriteBase?

Vyzkoušeno, po odkomentování mě to jen přesměruje na localhost:8080 při zachování linku, tedy localhost:8080/aa/contact/ dá ve výsledku obsah localhost:8080/, což je předpokládám správně, když rewritebase je /. Soubor .htaccess jsem nijak něměnil, jen jsem překopíroval ty, co jsou v sandboxu.

jtousek
Člen | 951
+
0
-

Ukaž .htaccess.

Potom jsou mi divný ty makra {link ...}. „Team“ a „Matches“ jsou presentery nebo akce?

/app/presenters/HomepagePresenter.php -zde je funkce renderDefault()

Myslíš tím doufám metodu HomepagePresenter::renderDefault()?

Giron
Člen | 13
+
0
-

jtousek napsal(a):

Ukaž .htaccess.

Potom jsou mi divný ty makra {link ...}. „Team“ a „Matches“ jsou presentery nebo akce?

/app/presenters/HomepagePresenter.php -zde je funkce renderDefault()

Myslíš tím doufám metodu HomepagePresenter::renderDefault()?

Team a Matches jsou presentery. Když se podívám zpětně na tu strukturu, co jsem popsal v prvním postu, tak v podstatě chci, aby z @layout.phtml, kde mam menu, vedli linky, které zobrazí obsah kupříkladu /app/templates/Contact/default.phtml a to pomocí Presenteru /app/presenters/Contact.php, který má metodu renderDefault():

class ContactPresenter extends BasePresenter
{

	public function renderDefault()
	{
		$this->template->message = 'Contact je tu!';
	}

}

Naprosto stejně vypadají všechny ostatní Presentery až na změnu názvu třídy a jiný obsah message. Co se týče .htaccess souboru, jsou poněkud delší a je jich několik v různých složkách, tak nevím jestli je mám postnout. Každopádně jsou to POUZE kopie souborů .htaccess použitých v sandbox složce Nette distribuce popsané v prvním příspěvku bez jakékoliv změny, tak nepředpokládám, že by byli špatně.

studna
Člen | 181
+
0
-

Stačí když jsem hodíš .htaccess, který máš vedle index.php.

EDIT: Je to čtyřistačtverka od Nette nebo obyčejná?

Editoval studna (16. 4. 2011 19:35)

Giron
Člen | 13
+
0
-

studna napsal(a):

Stačí když jsem hodíš .htaccess, který máš vedle index.php.

EDIT: Je to čtyřistačtverka od Nette nebo obyčejná?

Je to obyčejná:

Not Found

The requested URL blabla/document_root/index.php was not found on this server.

Obsah .htaccess, který je u index.php:

# Apache configuration file (see httpd.apache.org/docs/2.2/mod/quickreference.html)

# disable directory listing
Options -Indexes

# allows symbolic links in this directory
Options +FollowSymLinks

# configure PHP
# <IfModule mod_php5.c>
#	php_flag register_globals off
#	php_flag zend.ze1_compatibility_mode off
#	php_flag session.auto_start off
# </IfModule>

# enable cool URL
<IfModule mod_rewrite.c>
	RewriteEngine On
	# RewriteBase /

	# front controller
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
</IfModule>

# default charset should be UTF-8
AddDefaultCharset utf-8

# enable gzip compression
<IfModule mod_deflate.c>
	AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript text/javascript application/javascript application/json
</IfModule>

# allow combined JavaScript & CSS. Inside of script.combined.js you could use <!--#include file="script.js" -->
<IfModule mod_include.c>
	<FilesMatch "\.combined\.(js|css)$">
		Options +Includes
		SetOutputFilter INCLUDES
	</FilesMatch>
</IfModule>
jtousek
Člen | 951
+
0
-

Mě na tom nevíc vadí, že to máš v podsložce /aa/. Sám nic takového na localhostu nepoužívám takže netuším, jak se to chová při použití Nette. Co vím určitě je, že bez Nette to způsobuje tak akorát problémy a pochybuju, že s Nette to bude jinak.

Nicméně tohle je spíše střela od boku a problém může klidně být úplně jinde.

EDIT

Zkus do bootstrapu dát něco jako die('test'); a pak si dej do browseru jednu z těch adres co ti hází 404. Pokud to vypíše „test“ tak je problém v nejspíš v routách. Pokud to hodí 404 tak je problém v .htaccess/mod_rewrite/konfiguraci apache.

Editoval jtousek (16. 4. 2011 21:30)

Giron
Člen | 13
+
0
-

Díka za tip, při použítí die mi to vypíše test rovnou, nedostanu se ani na Homepage, bez toho se na Homepage dostanu, ale nefungují linky. Malé doplnění k Apache, mám vytvořené aliasy pro několik webů, co mám na localhostu, alias směřuje do složky document_root, kde je bootstrap a index. Takže to „/aa“ je jen alias, dopíšu to do úvodního postu.

jtousek
Člen | 951
+
0
-

Tak mě napadá, zkus tu druhou routu předělat následovně:

Nyní:

$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

Zkus:

$router[] = new Route('/<presenter>/<action>[/<id>]', 'Homepage:default');

Tedy přidat lomítko na začátek, popřípadě tam zkus přidat „/aa/“ nebo „aa/“.

Giron
Člen | 13
+
0
-

Děkuji za radu, vyzkoušeno a bohužel, nepomohlo.
Následující vyhodí 404 od Nette, pro HTTP požadavek neexistuje route.

$router[] = new Route('aa/<presenter>/<action>[/<id>]', 'Homepage:default');

Následující vyústí v problém, kdy se Nette snaží načíst Presenter s názvem aa.

$router[] = new Route('/<presenter>/<action>[/<id>]', 'Homepage:default');

A nakonec následující funguje stejně jako původní nastavení, tedy homepage naběhne, ale linky vyhazují klasické Not Found.

$router[] = new Route('/aa/<presenter>/<action>[/<id>]', 'Homepage:default');

Editoval Giron (16. 4. 2011 23:10)

jtousek
Člen | 951
+
0
-

OK, došly mi nápady. Teď to můžeš asi tak akorát zabalit (do archivu) a někam nahrát. ;-)

Giron
Člen | 13
+
0
-

Hehe jasné :-) Njn, to bude nějaká blbůstka někde nebo to bude servrem, zítra snad budu mít možnost to vyzkoušet u kamaráda na servru. Každopádně všem děkuji za váš čas.

Giron
Člen | 13
+
0
-

Problém vyřešen, viz. první příspěvek, všem děkuji.