/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Ændre udseende på url
Fra : Dennis Munding


Dato : 30-07-10 18:21

Hej alle!

Hvordan er det nu lige man ændrer

http://mit-domæne.dk/?side=velkommen

til

http://mit-domæne.dk/Velkommen

??

Svjh er det noget med en .htaccess fil...??


Med venlig hilsen
--
Dennis Munding
a.k.a. The Eye - Member of the PosseGrim Squad
http://pgsquad.com/
"When you hear the wind - you're already dead..."


 
 
Martin (31-07-2010)
Kommentar
Fra : Martin


Dato : 31-07-10 19:40

On 30-07-2010 19:20, Dennis Munding wrote:
> Hej alle!
>
> Hvordan er det nu lige man ændrer
>
> http://mit-domæne.dk/?side=velkommen
>
> til
>
> http://mit-domæne.dk/Velkommen
>
> ??
>
> Svjh er det noget med en .htaccess fil...??

Options +FollowSymlinks
RewriteEngine on

RewriteRule ^/(.*)?$ /index.php?side=$1

Smid ind i htaccess filen

Dennis Munding (01-08-2010)
Kommentar
Fra : Dennis Munding


Dato : 01-08-10 12:28

Hej Martin!
"Martin" skrev...
> Options +FollowSymlinks

Skal ovenstående linje med??

> RewriteEngine on
>
> RewriteRule ^/(.*)?$ /index.php?side=$1

Har jeg så forsøgt - uden held...

Jeg kiggede så i supporten på webhotellet (Surftown).
I deres eksempel i deres guide står der flg. - de bruger WebShell:

<IfModule mod_security.c>
SecFilterEngine Off
</IfModule>

Det jeg tænker på er, om første og sidste linje skal med i den kode, jeg
skal bruge, og om der skal stå noget bestemt...?
(Jeg har forsøgt med ovenstående linjer - osse uden held...)

På forhånd tak for hjælpen.


Med venlig hilsen
--
Dennis Munding
a.k.a. The Eye - Member of the PosseGrim Squad
http://pgsquad.com/
"When you hear the wind - you're already dead..."


Martin (02-08-2010)
Kommentar
Fra : Martin


Dato : 02-08-10 12:57

On 01-08-2010 13:27, Dennis Munding wrote:
> Hej Martin!
> "Martin" skrev...
>> Options +FollowSymlinks
>
> Skal ovenstående linje med??

Den er nu meget rar at have med hvis man bruger symlinks, men det tyder
ikke på du gør det, så den kan du undvære

>
>> RewriteEngine on
>>
>> RewriteRule ^/(.*)?$ /index.php?side=$1

Er rewritemodulet installeret?
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^/(.*)?$ /index.php?side=$1
</IfModule>

Hvis ikke det virker, så tror jeg ikke rewrite enginen er slået til hos
din udbyder.

> Har jeg så forsøgt - uden held...
>
> Jeg kiggede så i supporten på webhotellet (Surftown).
> I deres eksempel i deres guide står der flg. - de bruger WebShell:
>
> <IfModule mod_security.c>

Denne linje betyder at den lige laver et tjek om modulet mod_security er
installeret og funktionelt.

> SecFilterEngine Off

Jeg har aldrig nogensinde brugt denne - men hvis du vil læse op på den,
så er der en masse på
<http://www.modsecurity.org/documentation/modsecurity-apache/1.9.3/html-multipage/03-configuration.html>

> </IfModule>
>
> Det jeg tænker på er, om første og sidste linje skal med i den kode, jeg
> skal bruge, og om der skal stå noget bestemt...?
> (Jeg har forsøgt med ovenstående linjer - osse uden held...)
>
> På forhånd tak for hjælpen.
>
>
> Med venlig hilsen


Martin Larsen (04-08-2010)
Kommentar
Fra : Martin Larsen


Dato : 04-08-10 14:57

Martin wrote:

> Den er nu meget rar at have med hvis man bruger symlinks, men det tyder
> ikke på du gør det, så den kan du undvære

Det er en anelse mere effektivt at have Options +FollowSymlinks" med
idet serveren så ikke skal bruge tid på at undersøge om en url krydser
en symlink, men i praksis er det ligegyldigt.

Hilsen
Martin



Dennis Munding (05-08-2010)
Kommentar
Fra : Dennis Munding


Dato : 05-08-10 12:51

Hej Martin!
"Martin" skrev...
> Dennis Munding wrote:
>> Hej Martin!
>>> Options +FollowSymlinks
>>
>> Skal ovenstående linje med??
>
> Den er nu meget rar at have med hvis man bruger symlinks, men det tyder
> ikke på du gør det, så den kan du undvære

Jeg må melde hus forbi - så meget er jeg ikke inde i det (Læs: Aner ikke
hvad SymLinks er/gør).

> Er rewritemodulet installeret?

Jep!
Kontaktede supporten på mit webhotel - som iøvrigt kører PHP 5.2 - for at
sikre mig.

> RewriteRule ^/(.*)?$ /index.php?side=$1

Her taber jeg tråden...
Jeg har forsøgt at sætte mig ind i regular expressions, men kan alligevel
ikke tolke ovenstående helt...
Det der forvirrer mig mest er, at du har indsat "index.php" - hvorfor?

Selvfølgelig har jeg en fil ved navn index.php, men det kommer på intet
tidspunkt til at stå i adresselinjen.

Hvis det kan hjælpe (jeg kan jo have udtrykt mig forkert/givet vildledende
info), så ser mine links således ud i menuen:

/?side=XXX

Hvor XXX repræsenterer sidenavnet - eks. velkommen

I adresselinjen kommer der så til at stå:
http://mit-domæne.dk/?side=XXX

hvor jeg så gerne vil have det til at se således ud:
http://mit-domæne.dk/XXX

Min index-fil henter sidenavnet og henter derefter de rette elementer til
den pågældende side.


Hvad har jeg misforstået??
For jeg er sikker på, at der er noget, jeg misser...


Takker på forhånd for hjælp og tålmodighed.


Med venlig hilsen
--
Dennis Munding
a.k.a. The Eye - Member of the PosseGrim Squad
http://pgsquad.com/
"When you hear the wind - you're already dead..."


Martin (07-08-2010)
Kommentar
Fra : Martin


Dato : 07-08-10 17:10

On 05-08-2010 13:50, Dennis Munding wrote:
> Hej Martin!
> "Martin" skrev...
>> Dennis Munding wrote:
>>> Hej Martin!
>>>> Options +FollowSymlinks
>>>
>>> Skal ovenstående linje med??
>>
>> Den er nu meget rar at have med hvis man bruger symlinks, men det tyder
>> ikke på du gør det, så den kan du undvære
>
> Jeg må melde hus forbi - så meget er jeg ikke inde i det (Læs: Aner ikke
> hvad SymLinks er/gør).

I windows ville man kalde det "genveje" dog er de bare en HEL DEL mere
avanceret på linux.

>
>> Er rewritemodulet installeret?
>
> Jep!
> Kontaktede supporten på mit webhotel - som iøvrigt kører PHP 5.2 - for
> at sikre mig.

Godt

>
>> RewriteRule ^/(.*)?$ /index.php?side=$1
>
> Her taber jeg tråden...

Så fanger vi den igen

> Jeg har forsøgt at sætte mig ind i regular expressions, men kan
> alligevel ikke tolke ovenstående helt...

^/(.*)?$
^ betyder i starten af strengen
/ betyder en skråstreg
() er bare en markering, som så kan bruges senere
..* betyder ALT
? betyder ikke nødvendigt
$ betyder i slutningen af strengen

Så på godt dansk er det noget ala
Hvis der er i starten af strengen er en / (er der altid da URL altid er
www.domain.com/) efter skråstregen er der så ALT - men der behøver ikke
være noget ALT. - og vi grupperer lige ALT

> Det der forvirrer mig mest er, at du har indsat "index.php" - hvorfor?

Du kunne også sagtens skrive
/?side=$1
jeg kan nu bare bedre lide index.php - bare så man er helt sikker - men
det kunne også sagtens være
/article.php?id=$1

> Selvfølgelig har jeg en fil ved navn index.php, men det kommer på intet
> tidspunkt til at stå i adresselinjen.

Nej nemlig - Apache (din webserver) siger til SERVEREN at den skal fortolke
www.domain.com/123
som
www.domain.com/index.php?side=123

men den skal jo ikke redirecte til
www.domain.com/index.php?side=123

> Hvis det kan hjælpe (jeg kan jo have udtrykt mig forkert/givet
> vildledende info), så ser mine links således ud i menuen:
>
> /?side=XXX

Se det er så forkert.
Faktisk skal du kalde dem
www.domain.com/123 (eller bare /123)
Det er jo det din browser skal vise

> Hvor XXX repræsenterer sidenavnet - eks. velkommen

Så skriver vi bare
/velkommen

> I adresselinjen kommer der så til at stå:
> http://mit-domæne.dk/?side=XXX
>
> hvor jeg så gerne vil have det til at se således ud:
> http://mit-domæne.dk/XXX
>
> Min index-fil henter sidenavnet og henter derefter de rette elementer
> til den pågældende side.

Bemærk at hvis man skriver
www.domain.com
så fortolker din webserver det faktisk som
www.domain.com/index.php?side=

Altså $_GET['side'] er tom
og bemærk at hvis man skriver
www.domain.com/../etc/kodeordsfil

Så er $_GET['side'] = '../etc/kodeordsfil'

Så du skal virkelig kigge at du ikke bare skriver
include $_GET['side'];

Her kan man evt. lave det tjek i PHP filen, eller direkte i htaccess
i PHP kunne det være noget ala

if (!isset($_GET['side'])) $_GET['side'] = 'forside';
if ($_GET['side'] == '') $_GET['side'] = 'forside';
if (!in_array($_GET['side'], $allowedPages)) {
header('location: /404');
exit;
// Man kunne tilføje nogle flere headers at siden ikke eksisterer osv.
}

require $_GET['side'];


> Hvad har jeg misforstået??
> For jeg er sikker på, at der er noget, jeg misser...

Det korte af det lange er at du linker forkert til dine adresser - dem
skal du skrive som du vil have det til at se ud i browseren.

Martin Larsen (08-08-2010)
Kommentar
Fra : Martin Larsen


Dato : 08-08-10 12:08

Martin wrote:

> RewriteRule ^/(.*)?$ /index.php?side=$1

Jeg vil foreslå:

RewriteRule ^(\w*)?$ /index.php?side=$1

Den indledende skråstreg skal ikke være der i en .htaccess (men derimod
hvis den var deklareret direkte Apaches konfigureringsfil).

Dernæst så går serveren i ring i en evig omdirigeringsløkke (indtil den
giver op), fordi:

/side1 omdirigeres til /index.php?side=side1 som igen omdirigeres til
/index.php?side=index.php osv.

Ved at bruge \w i stedet for . i regexen, så er det kun url med
bogstaver og tal som bliver fanget. Punktummet i index.php matcher
derimod ikke, så vi undgår løkken.

Man kunne også klare det med en RewriteCond, men her synes jeg det andet
er lettere.

Hilsen
Martin

Martin (08-08-2010)
Kommentar
Fra : Martin


Dato : 08-08-10 19:05

On 08-08-2010 13:07, Martin Larsen wrote:
> Martin wrote:
>
>> RewriteRule ^/(.*)?$ /index.php?side=$1
>
> Jeg vil foreslå:
>
> RewriteRule ^(\w*)?$ /index.php?side=$1
>
> Den indledende skråstreg skal ikke være der i en .htaccess (men derimod
> hvis den var deklareret direkte Apaches konfigureringsfil).

Som svjh er standard i en apache opsætning

>
> Dernæst så går serveren i ring i en evig omdirigeringsløkke (indtil den
> giver op), fordi:
>
> /side1 omdirigeres til /index.php?side=side1 som igen omdirigeres til
> /index.php?side=index.php osv.

Som så ikke findes, og så bliver der redirectet til /404 - hvis man
ellers har sat det op :)

>
> Ved at bruge \w i stedet for . i regexen, så er det kun url med
> bogstaver og tal som bliver fanget. Punktummet i index.php matcher
> derimod ikke, så vi undgår løkken.

Så skal du lige huske bindestreg og måske _
jeg har det sådan at lave så lidt arbejde i .htaccess og lave så lidt
kontrol som muligt, så hvis man skriver programmet om, så er det ikke
htaccess der bremser det.

Martin Larsen (10-08-2010)
Kommentar
Fra : Martin Larsen


Dato : 10-08-10 14:01

Martin wrote:

> Så skal du lige huske bindestreg og måske _
> jeg har det sådan at lave så lidt arbejde i .htaccess og lave så lidt
> kontrol som muligt, så hvis man skriver programmet om, så er det ikke
> htaccess der bremser det.

Nu prøvede jeg simpelthen det oprindelige forslag og konstaterede vha
rewrite.log at den stoppede efter et antal omdirigeringer og lavede en
serverfejl. Med de få rettelser virkede det fint, men det er ikke det
samme som at det ikke kan laves på andre måder eller optimeres
yderligere. Det kan det helt sikkert.

Hilsen
Martin

Martin (10-08-2010)
Kommentar
Fra : Martin


Dato : 10-08-10 17:23

On 10-08-2010 15:00, Martin Larsen wrote:
> Martin wrote:
>
>> Så skal du lige huske bindestreg og måske _
>> jeg har det sådan at lave så lidt arbejde i .htaccess og lave så lidt
>> kontrol som muligt, så hvis man skriver programmet om, så er det ikke
>> htaccess der bremser det.
>
> Nu prøvede jeg simpelthen det oprindelige forslag og konstaterede vha
> rewrite.log at den stoppede efter et antal omdirigeringer og lavede en
> serverfejl. Med de få rettelser virkede det fint, men det er ikke det
> samme som at det ikke kan laves på andre måder eller optimeres
> yderligere. Det kan det helt sikkert.

Bemærk hvad jeg skrev til Dennis

<quote>
if (!isset($_GET['side'])) $_GET['side'] = 'forside';
if ($_GET['side'] == '') $_GET['side'] = 'forside';
if (!in_array($_GET['side'], $allowedPages)) {
header('location: /404');
exit;
// Man kunne tilføje nogle flere headers at siden ikke eksisterer osv.
}

require $_GET['side'];
</quote>

Så her vil den max lave 1 loop :)
Ovenstående !in_array kunne selvfølgelig være hvad som helst, database
kald, controller kontrol osv osv.

PS
Husk at google elsker bindestreger, så de er også rimelig væsentlige at
få med - så er der så alle de danske bogstaver som ikke fanges med \w (i
visse tilfælde, kan ikke lige huske præcis hvordan det er, men nogle
gange bliver de ikke omkrevet til deres korrekte URI navn) - så er der
jo nogle som linker til sider med mellemrum (ja, det sker jo) så bliver
det til side%20med%20mellemrum - så virker \w heller ikke.

Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste