.htaccess riscrivi “/book.php?id=1234” a “/ book / 1234”

Questo è quello che ho finora nel mio ambiente di sviluppo:

php_value error_log log/php.log php_value display_errors 1 php_value magic_quotes_gpc Off RewriteEngine On # remove slash RewriteCond %{REQUEST_FILENAME} !-d # file.php to /file RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/ RewriteCond %{REQUEST_URI} !^/ajax.php RewriteRule ^(.+)\.php$ http://localhost/$1 [R=301,L] # /file to file.php RewriteRule ^([^/.]+)$ $1.php [L] 

Ho provato molte varianti di questa regola ma ottengo sempre un errore di 500:

 RewriteRule ^(.*)$ /book.php?url=$1 [L] 

E questo è nel mio error.log di Apache:

 [Fri Jul 27 19:56:51 2012] [error] [client 127.0.0.1] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace. 

Cosa mi manca, perché il ciclo di reindirizzamento?

Sembra che il tuo RewriteRule come scritto stia cercando di fare l’opposto di ciò che sta dicendo la tua domanda. Si dice che si desidera htaccess rewrite /book.php?id=1234 to /book/1234 , ma la RewriteRule :

 RewriteRule ^(.*)$ /book.php?url=$1 [L] 

Sta aggiungendo un parametro stringa di query.

La RewriteRule di seguito riscriverà rewrite /book.php?id=1234 to /book/1234

 RewriteCond %{QUERY_STRING} ^id=([0-9]*)$ RewriteRule ^book\.php$ /book/%1? [L] 

Inoltre, se davvero vuoi andare dall’altra parte, cioè riscrivi /book/1234 a /book.php?id=1234 il seguente dovrebbe farlo:

 RewriteRule ^book/(.*)$ /book.php?id=$1 [L]