Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Linki via ForceType vs. klasyczne.
Forum PHP.pl > Forum > PHP
scanner
No i mam dylemat.
Udało mi się w prosty w sumie sposób dzięki .htaccess i ForceType uzyskać url'ew stylu:
Cytat

gdzie go, to plik php którego dotyczy właśnie ForceType a news/page/3 to oczywista parametry (umieszczone w $_SERVER['PATH_INFO'])
W tym jednak momencie musże uwzględnić fakt, że nie zawsze może byc możliwość użycia .htaccess i trzeba będzie stosować zwykłe linki.
Cytat


Najprostrzym rozwiązaniem byłoby po prostu zapisanie w konfiguracji np. [php:1:fe81bd4028]<?php
$arrConfig['UseNiceUrls'] = (true|false};
?>[/php:1:fe81bd4028]

Tutaj jednak rodzi się problem. Jeśłi nie będzie można wykorzystać ForceType, trzeba będzie zamienić plik startowy na go.php i podmienić moduł odpowiedzialny za generowanie i parsowanie linków.

I teraz temat do dyskusji - w jaki sposób skrypt mógłby rozpoznać, czy można używac ForceType, zakładając, że plik .htacces istnieje, tylko nie jest analizowany.
rzseattle
Hmm moze skrypt przy pierwszym odpaleniu probowal otworzyc stronke i zpojzec na to co zostanie zwrocone przez serv. Ewentualnie moze sprobowac odpalic plik ktory zmieni cos w konfigu czyli np odpalasz jeden plik dzieki forcetype i jesli sie odpali to zmieni w konfigu typ wykorzystywanego urla a jesli nie to nie winksmiley.jpg.
DeyV
wydaje mi się, że pierwszy pomysł rzseattle można wykonać w ten sposób, że przy pierwszym uruchomieniu:
a) zapisujemy do sesji informację otym, żę przeprowadzzamy test
cool.gif przekierowywujemy na nasz ForceType 'owy adres.
c) sprawdzamy czy mamy odpowiedni parametr przychodzący z adresu, oraz z sesji. Jeśli tak - dalej pracujemy na ForceType (info o tym zapisujemy np. w sesji) , jeśli nie - pozostaje standard.
scanner
Ja na razie opracowałem coś takiego:
.htaccess
Kod
<Files go>

    ForceType application/x-httpd-php

</Files>
config.inc.php[php:1:038e915fbf]<?php
$arrConfig['UseNiceUrls'] = false;
?>[/php:1:038e915fbf]index.php[php:1:038e915fbf]<?php
if (is_readable('config.inc.php'))
{
require_once('config.inc.php');
}
$strRedirector = ($arrConfig['UseNiceUrls'] === true) ? 'go' : 'go.php';
{
if(!is_readable( $strRedirector ))
{
die( '<b>Fatal error:</b> System file not found.');
}
header('Location:'.$strRedirector);
}
?>[/php:1:038e915fbf]go / go.php[php:1:038e915fbf]<?php
require_once('code/controller.php');
?>[/php:1:038e915fbf]A controller.php to juz będzie reszta aplikacji. Co myślicie o takim rozwiązaniu?
Seth
IMO dobre rozwiazanie.

Jednak aby nie ustawiac tego samemu mozna bylo by stworzyc wlasna strone bledu 404 i na podstawie URLa sprawdzac czy w blednym adresie mamy na poczatku go. Jezeli tak to zapisujemy w configu $arrConfig['UseNiceUrls'] = false.
Oczywiscie mozna bylo by tozrobic tylko wtedy gdy mamy dostep do tworzenia wlasnych stron z bledami.

Mozna bylo by tez zrobic to nieco inaczej.
Podczas instalacji skryptu umieszczali bysmy testowa strone dostepna przez /go/test - wyswietlajaca tylko np. 1.
Juz na etapie instalacji - po zapisaniu strony testowej - za pomoca socketow pobieramy strone testowa uzywajac adresu w postaci /go/test. Jezeli pobrana strona bedzie zawierala 1 to znaczy, ze ForceType mamy wlaczone, jezeli nie to nie mamy winksmiley.jpg
I teraz na tej podstawie tworzymy plik config w postaci takie jak podales.

Edit: po tescie oczywisci usuwamy strone testowa
spenalzo
php => 4.3.2

[php:1:452a60378d]<?php
if(in_array("mod_mime",apache_get_modules()))
{
$arrConfig['UseNiceUrls'] = TRUE;
}
else
{
$arrConfig['UseNiceUrls'] = FALSE;
}
?>[/php:1:452a60378d]

Przy instalacji sprawdzasz wersje php i jeżeli jest => 4.3.2 to wykonujesz ten kod, a jeżeli nie to coś innego.
scanner
Spenalzo: ale co mi da mod_mime, jesli .htaccess nie bedzie parsowany?
spenalzo
Hm fakt.

Można zrobić jeszcze tak, że przy instalacji otwierasz malutkie okienko JS w którym jako strona1.php masz kod przekierowujący na strona2.php - jeżeli działa to zamykasz okienko i wstawiasz do ukrytego pola że forcetype, a jeżeli nie działa (dajesz timeota) zamykasz i wstawiasz, że zwykłe linki.
Strona1.php powinna byc ramka, zeby po nieudanym wskoczeniu na strona2.php mozna bylo zamknac automatycznie okienko.
scanner
Spen: a jeśki ktoś nie ma JS?

Na razie pozostanę przy tym rozwiązaniu - i tak oba pliki (go i go.php) wywołują i iurichamiają klasę kontrolera.

Zastanawiam się też, czy taka kombinacja ma w ogóle sens. MOże założyć, że user ma możłiwosć obsługi .htaccess na swoim koncie?
Jeśli tak, to można od razu w htaccess wpisac "DirectoryIndex go" i odpada index.php...
Seth
Korzystajac z chwili czasu tutaj napisalem ten moj sposob z socketami:
[php:1:372587263c]<?php
$host = '<adres servera>';
$adress = '/go/test';
$port = 80;

$errmsg = null;
$errno = null;

$chndr = fsockopen( $host, $port, &$errno, &$errmsg, 3 );

if ( $chndr == false )
{
print 'Blad nr: '.$errno.' wiadomosc bledu: '.$errmsg.'<br />';
}
else
{
fputs( $chndr, 'GET '.$adress." HTTP/1.0rn" );
fputs( $chndr, "Host: $hostrn" );
fputs( $chndr, "Referer: http://$host/rn" );
fputs( $chndr, "Content-type: application/x-www-form-urlencodedrn" );
fputs( $chndr, "Connection: closernrn" );

$end_headers = false;
$content = '';

while ( !feof( $chndr ) )
{
$line = fgets( $chndr, 1024 );

if ( $end_headers )
{
$content .= $line;
}

if ( $end_headers === false && ( $line == "rn" || $line == "n" ) )
{
$end_headers = true;
}
}

if ( trim( $content ) == '1' )
{
// Wlaczone ForceType
}
else
{
// Wylaczonne ForceType

}
}
?>[/php:1:372587263c]
scanner
No po prostu nie mam pytań...
Seth, może byś się zajął pracą?
Odpalmy wreszcie php.pl, napiszmy tThota, to będę mógł znowu zaglębnić się w naukę php...

Pomysł genialny, a ja mam task: poczytać o socketach.
DeyV
Cytat
MOże założyć, że user ma możłiwosć obsługi .htaccess na swoim koncie?  


scanner - nie można. Wiele kont komercyjnych nie oferuje htaccess, preferując włąsne rozwiazania zarządzania kontem.

ps. czy to ma oznaczać, że taki test jaki podałem, (wykorzystywany rownież np. do sprawdzania czy jest dostęp do ciasteczek) nie sprawdzi sie w tym przypadku?
scanner
DeyV: sprawdzam właśnie kod Setha - przy Twoim sprawdzaniu myślę, ze wystarczyłoby po przekierowaniu na test sprawdzić czy istnieje $_SERVER['PATH_INFO']
scanner
Skłądając wszystkie Wasze myśli do kupy, wywłodziłem (łącznie z kodem Setha), coś takiego (.htacces- jak wyżej). Co o tym myslicie teraz? (sorki za wklejenie kodu Setha w całości, ale nie chciałm ciąc żeby się nic nie zgubiło)[php:1:dbccdd269d]<?php
/**
* Sprawdzanie, czy jest mozliwe uzycie NiceUrl's
* @package Oberon
* @author seth@php.pl
* @file index.php
*/
session_start();

$host = $_SERVER['SERVER_NAME'];
$adress = '/Oberon/go/test';
$port = 80;

$errmsg = null;
$errno = null;

$chndr = fsockopen( $host, $port, $errno, $errmsg, 3 );

if ( $chndr == false )
{
die('<b>Fatal error:</b> ('.$errno.') '.$errmsg.'<br />');
}
else
{
fputs( $chndr, 'GET '.$adress." HTTP/1.0rn" );
fputs( $chndr, "Host: $hostrn" );
fputs( $chndr, "Referer: http://$host/rn" );
fputs( $chndr, "Content-type: application/x-www-form-urlencodedrn" );
fputs( $chndr, "Connection: closernrn" );

$end_headers = false;
$content = '';

while ( !feof( $chndr ) )
{
$line = fgets( $chndr, 1024 );

if ( $end_headers )
{
$content .= $line;
}

if ( $end_headers === false && ( $line == "rn" || $line == "n" ) )
{
$end_headers = true;
}
}

if ( trim( $content ) == '1' )
{
$_SESSION['UseNiceUrls'] = true;
header('Location: go');
}
else
{
$_SESSION['UseNiceUrls'] = false;
require_once('engine.php');
}
}
?>[/php:1:dbccdd269d][php:1:dbccdd269d]<?php
/**
* @package Oberon
* @author scanner@php.pl
* @file index.php
*/
session_start();
if(isset($_SERVER['PATH_INFO']) && ($_SERVER['PATH_INFO'] == '/test'))
{
die(true);
}
else
{
require_once('engine.php');
}
?>[/php:1:dbccdd269d][php:1:dbccdd269d]<?php
/**
* @package Oberon
* @author scanner@php.pl
* @file engine.php
*/
if(!isset($_SESSION))
{
session_start();
}
var_dump($_SESSION);
?>[/php:1:dbccdd269d]
Seth
Tylko czy nie lepiej dac to tylko przy instalacji, a pozniej zapisac wynik do pliku ? Wted zaoszczedzimy troche czasu na sprawdzaniu caly czas czy mamy ForceType.
scanner
Przy instalacji, to nie musżę sprawdzać, tylko sam dam do konfigu (albo zrobi to instalator, w którym będą linki klasyczne.
A co, jełśi skrypt będzie dział, wszystko będzie ok, i nagle admin włączy możliwosć stosowania forcetype?
Wtedy skrypt automagicznie przełaczy się na NiceUrls.
Oczywiście to są tylko moje luźne rozważania...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.