Linky odkazují na Not Found
- Giron
- Člen | 13
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
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)
- Pavel Kouřil
- Člen | 128
A máš správně nastavený .htaccess? Možná zkus odkomentovat/zakomentovat RewriteBase?
- Giron
- Člen | 13
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.
- Giron
- Člen | 13
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ě.
- Giron
- Člen | 13
studna napsal(a):
Stačí když jsem hodíš
.htaccess
, který máš vedleindex.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
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
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
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
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)