.htaccess переписать "/book.php?id=1234" в "/book/1234"
Это то, что у меня есть в моей среде разработки:
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]
Я перепробовал много вариантов этого правила, но всегда получаю ошибку 500:
RewriteRule ^(.*)$ /book.php?url=$1 [L]
И это в моем Apache error.log:
[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.
Чего мне не хватает, почему цикл перенаправления?
2 ответа
Решение
Ваш RewriteRule
как написано, похоже, пытается сделать вопреки тому, что говорит ваш заголовок вопроса. Вы говорите, что хотите htaccess rewrite /book.php?id=1234 to /book/1234
, но твой RewriteRule
:
RewriteRule ^(.*)$ /book.php?url=$1 [L]
Добавляет параметр строки запроса.
RewriteRule ниже перепишет rewrite /book.php?id=1234 to /book/1234
RewriteCond %{QUERY_STRING} ^id=([0-9]*)$
RewriteRule ^book\.php$ /book/%1? [L]
Кроме того, если вы действительно хотите пойти другим путем, то есть переписать /book/1234
в /book.php?id=1234
следующее должно сделать это:
RewriteRule ^book/(.*)$ /book.php?id=$1 [L]
Попробуй это!
# in htaccess file write this
RewriteEngine on
RewriteRule ^book/([0-9]+) book.php?id=$i
# and in you html or php file call
book.php?id=$i
страница за
book/$i
вы сделали.