/ / Apache mod_rewrite szuka foo.php - php, apache, .htaccess, mod-rewrite

Apache mod_rewrite szuka foo.php - php, apache, .htaccess, mod-rewrite

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 № 1

Wyglą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.