Próbuję śledzić samouczek mod_rewrite ale nie mogę uzyskać konkretnego przykładu do pracy. Włączyłem mod_rewrite i działa on dla prostych przykładów, takich jak poniższe .htaccess
.
# Redirect everything in this directory to "good.html"
RewriteEngine on RewriteRule .* good.html
Poniższy kod jest treścią mojego .htaccess
# Enable Rewriting
RewriteEngine on
# Rewrite user URLs
# Input: user/NAME/
# Output: user.php?id=NAME
RewriteRule ^user/(w+)/?$ user.php?id=$1
Rozejrzałem się i dowiedziałem się jak się zalogować co robił mod_rewrite, a moje dzienniki pokazywały następujące informacje
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678 [rid#417c1518/subreq] (3) [perdir /var/www/] add path info postfix: /var/www/user.php -> /var/www/user.php/bob
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417c1518/subreq] (3) [perdir /var/www/] strip per-dir prefix: /var/www/user.php/bob -> user.php/bob
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417c1518/subreq] (3) [perdir /var/www/] applying pattern "^user/(\w+)/?$" to uri "user.php/bob"
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417c1518/subreq] (1) [perdir /var/www/] pass through /var/www/user.php
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417ae4d0/initial] (3) [perdir /var/www/] add path info postfix: /var/www/user.php -> /var/www/user.php/bob
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417ae4d0/initial] (3) [perdir /var/www/] strip per-dir prefix: /var/www/user.php/bob -> user.php/bob
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417ae4d0/initial] (3) [perdir /var/www/] applying pattern "^user/(\w+)/?$" to uri "user.php/bob"
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417ae4d0/initial] (1) [perdir /var/www/] pass through /var/www/user.php
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417bb500/subreq] (3) [perdir /var/www/] strip per-dir prefix: /var/www/bob -> bob
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417bb500/subreq] (3) [perdir /var/www/] applying pattern "^user/(\w+)/?$" to uri "bob"
192.168.1.70 - - [03/Jan/1970:20:41:55 +0100] [192.168.1.64/sid#41353678][rid#417bb500/subreq] (1) [perdir /var/www/] pass through /var/www/bob
Rozumiem więc z dziennika, że wyrażenie regularne nie pasuje, ponieważ jest porównywane z user.php/bob
zamiast user/bob
. Jeśli zmienię regułę przepisywania na ^user.php/(w+)/?$
to działa. Nie rozumiem, dlaczego Apache szuka user.php
kiedy href nie zawiera .php
, patrz poniżej.
<a href="user/bob">user/bob</a>
Czy ktoś może wyjaśnić, jak sprawić, by Apache wyglądał user/bob
?
Jeśli to możliwe, czy ktoś może wyjaśnić, dlaczego tak się dzieje?
Odpowiedzi:
1 dla odpowiedzi № 1Wygląda na to, że multiviews dopasowuje „user” do „user.php” przed mod_rewrite nawet zostanie zastosowany. Spróbuj go wyłączyć:
Options -Multiviews
Multiviews jest częścią mod_negotiation i topróbuje „odgadnąć” żądany plik, szukając podobnie nazwanych plików (takich jak pliki bez rozszerzenia). Zostanie on zastosowany przed mod_rewrite, więc obejdzie regułę przepisywania.