Autor Zpráva
JanS01
Profil
Dobrý den,
předem se hluboce omlouvám, že jsem založil nové téma na již milionkrát omývané téma(i já sám jsem se tomu musel zasmát), ale i přes veškerou moji snahu, kdy jsem hledal jak zde na foru tak i na jiných webech, se mi nepodařilo vytvořit pěknou url (vyzkoušel jsem asi 50 verzí, které jsem si i sám přepisoval a opravoval).

Mám LAMP server na netbooku distribude Ubuntu 12.04LTS, Apache2, PHP5 atd:. projekty ukládám do adresáře /var/www/nazev_projektu, mod_rewrite mám povoleno, zapnuto a funkční.

V současné době mám adresu v tomto tvaru
http://localhost/projekt/?co=informace
a místo toho chci dostat
http://localhost/projekt/informace/.

<a href="?co=uvod">Úvodní stránka</a>
a stránky si poté includuji takto:
<?php
  if (!isset($_GET['co'])) {
                  $_GET['co'] = "uvod";
                }

  switch ($_GET['co']) {
                 case "uvod":
                    include 'pages/uvod.php';
                    break;
atd:.
Nastavení apache a jeho souborů:
/etc/apache2/sites-available/default
<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride All
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

Nevím kde dělám chybu, ale po týdnu zbytečného snažení jsem se rozhodnul zde požádat o pomoc.
Všechny varianty RewriteRule co jsou zde na foru na prvních 7 stránkách jsem vyzkoušel a bezúspěšně, možná si jen špatně předávám parametr, nebo pracuji špatně s odkazem, ale po tom množství co jsem vyzkoušel a nešlo to si radši nechám poradit i kdyby mě to mělo stát trošku zdravé kritiky.
Kajman
Profil
Do adresáře projekt dejte .htaccess

RewriteEngine On
RewriteRule ^([^/]*)/$ index.php?co=$1 [L]

Pak se může odkazovat např. takto

<a href="/projekt/uvod/">Úvodní stránka</a>

Ale pro jednodušší stěhování webu bude lepší, když si uděláte např. proměnnou s tím prefixem /projekt/ a budete ji přidávat do všech adres (i pro obrázky, javascripty, styly).
JanS01
Profil
Kajman:
Adresářovou strukturu mám:

ve složce pages mám všechny soubory které includuji v indexu, tedy na hlavní stránce.


RewriteEngine On
RewriteRule ^([^/]*)/$ index.php?co=$1 [L]

Pak se může odkazovat např. takto


<a href="/projekt/uvod/">Úvodní stránka</a>

Pokud použiju tento kod v odkazu tak proč bych do .htaccess psal index.php?co=$1 ?
nebo musím ještě přepsat switch pro include ? Zatím používám tohle
<?php
  if (!isset($_GET['co'])) {
                  $_GET['co'] = "uvod";
                }
 
  switch ($_GET['co']) {
                 case "uvod":
                    include 'pages/uvod.php';
                    break;
atd:.
a i když jsem přepsal položky v case tak se přeci dotazuji přes $_GET['co'], kterou ale ve vámi napsaném odkazu nevidím, možná jsem natvrdlí ale moc to nechápu

když jsem se snažil includovat stránku po dotazu ve stylu
if($_GET["/projekt/uvod"]) 
tak mi to také nešlo a výpis z error logu apache byl
[Wed Jun 19 20:00:24 2013] [error] [client 127.0.0.1] File does not exist: /var/www/projekt/uvod, referer: http://localhost/projekt/uvod/
[Wed Jun 19 20:00:24 2013] [error] [client 127.0.0.1] File does not exist: /var/www/404.html, referer: http://localhost/projekt/uvod/
Kajman
Profil
Nepsal jsem nic o tom, že by bylo potřeba měnit index.php, ten jste si měl nechat stejný. Stačí vložit ten .htaccess a opravit url.

přes $_GET['co'], kterou ale ve vámi napsaném odkazu nevidím

Uniklo Vám index.php?co=$1 viz. Mod_rewrite » Proměnné z regulárů
JanS01
Profil
Kajman:
Já jsem si nebyl jistý takže jsem vyzkoušel, to jak jste mi to napsal a pak jsem pro jistotu vyzkoušel i ostatní varianty, ale bezúspěšně. proto jsem se radši zeptal, zkusím si s tím ještě pohrát, třeba jsem se někde přehlédnul nebo přepsal, ale pokud znáte další možnosti jak toho docílit budu rád a každou radu uvítám, u mod_rewritu jsem špatně pochopil proměné díky za odkaz
Kajman
Profil
Takže Vám funguje adresa http://localhost/projekt/?co=uvod a když dáte do .htaccess uvedený kód (pozor, chvíli v něm chyběla hvězdička), zadáte adresu http://localhost/projekt/uvod/ tak se zobrazí co?
JanS01
Profil
Odkaz
<a href="/projekt/uvod/">Úvodní stránka</a>
---------------------------------------------------------------------
Include
<?php
   if (!isset($_GET['co'])) {
          $_GET['co'] = "uvod";
    }

    switch ($_GET['co']) {
     case "uvod":
       include 'pages/uvod.php';
       break;
--------------------------------------------------------------------
.htaccess
RewriteEngine On
RewriteRule ^([^/]*)/$ index.php?co=$1 [L]
takhle to ted mám a error log v apachy mě vypíše tohle(je to tam 10* asi to samé)
[Wed Jun 19 22:17:12 2013] [error] [client 127.0.0.1] File does not exist: /var/www/projekt/uvod, referer: http://localhost/projekt/uvod/
[Wed Jun 19 22:17:12 2013] [error] [client 127.0.0.1] File does not exist: /var/www/404.html, referer: http://localhost/projekt/uvod/

uvod se mi načte ale bez stylování a obrázků a to jen díky
if (!isset($_GET['co'])) {
          $_GET['co'] = "uvod";
    }
(nebo aspon si to myslím nebo se server snyží najít stránky v adresáři, které jsou defaultní)
a i když si nechám vypsat chyby tak se žádná neobjeví
<?php
ini_set("display_errors", 1); //nepouzivejte v PHP4
error_reporting(E_ALL);
?>
Kajman
Profil
JanS01:
uvod se mi načte ale bez stylování a obrázků

Styly a obrázky si musíte správně odkázat z nově vytvořené virtuální adresářové struktury, viz. [#2] případně viz. Mod_rewrite » Bacha na interpretaci cest
JanS01
Profil
Tak jsem přepsal cesty -> stačilo doplnit název projektu a všechny odkazy fungují jak jsem chtěl, v error logu mi to už žádné chyby nehází, switch jsem nechal původní co jsem měl.
Za cool url vám mnohokrát děkuji, kdybych si uvědomil už před tím, že po rewrite modu jsou alternativní cesty, dávno bych to měl, ale chybami se člověk učí :D.

CHtěl bych se ještě zeptat jak na dynamický title <TITLE> (pokud mám index pouze pro include hlavičky, patičky a prostředku tak vím jak na to, ale tohle je trošku jinačí případ)
mám stránku index.php kde mám thml tag head a v něm title a pak si jen uprostřed stránky includuji stránky(přes switch jak jsem psal výše), po všech pokusách mě funguje pouze
tento kod, který dám na začátek každé incluidované stránky
<script language="javascript">
document.title = "Text který se zobrazí v html tagu TITLE";
</script>
ale není to zrovna elegantní řešení

Další a již finální otázkou je jak při vyhledávání na serveru google zajistit aby po zadání názvu stránky, se vypsali i podstránky, např download kontakt atd:. jako je tomu např u seznamu (slovník atd)
JanS01
Profil
Takže můj poslední dotaz jsem si zodpověděl sám. Jedná se o google podstránky viz. http://support.google.com/webmasters/bin/answer.py?hl=cs&answer=47334, které se generují automaticky, takže to moc ovlivnit nemohu.

A pro generování dynamického title stačilo v indexu použít na začátku switch v kterém jsem si hlídal zvolenou stránku a pro každou stránku jsem měl case kde byl byla příslušná proměná title.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: