Я использовал ответ stackoverflow, чтобы понять, что я пытался сделать. Я хочу запросы http://myserver.com/book/1234 чтобы на самом деле показать php-файл формы содержимого http://myserver.com/book.php?id=1234
Итак, мой .htaccess выглядит так:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^id=([0-9]*)$
RewriteRule ^book/(.*)$ /book.php?id=$1 [L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]
Обратите внимание, что две нижние строки позволяют мне использовать URL-адрес, например http: //myserver.php/login на самом деле подтянуться http: //myserver.php/login.php Это работает правильно. Но при попытке позвонить я получаю ошибку 500 http://myserver.com/book.php?id=1234 Что случилось?
В вашем вопросе есть противоречивые утверждения, но если предположить, что это утверждение
Я хочу запросы http://myserver.com/book/1234 чтобы на самом деле показать php-файл формы содержимого http://myserver.com/book.php?id=1234
это то, что вы хотите.
Если вы запросите http://myserver.com/book.php?id=1234
- тогда ваш сервер отключится в зависимости от вашего текущего .htaccess. Причина в том, что вы должны выполнять только эту директиву
RewriteRule ^book/(.*)$ /book.php?id=$1 [L]
При определенных условиях, например если URL-адрес не для реального файла или каталога.
Эта директива
RewriteCond %{QUERY_STRING} ^id=([0-9]*)$
Сообщает apache не только продолжать и перезаписывать, когда запрос имеет форму
some_URI?id=some_number
но на самом деле перезапись будет происходить ТОЛЬКО, когда запрос имеет такую форму.
Когда запрос предназначен для http://myserver.com/book.php?id=1234
вы можете предотвратить перезапись с помощью
RewriteCond %{REQUEST_FILENAME} !-f
Итак, вы .htaccess
должен выглядеть
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^book/(.*)$ /book.php?id=$1 [L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]
Я только что протестировал это локально, и он работает. Убедитесь, что ваш apache.conf разрешает переопределения, указанные в файле .htaccess:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^\/book\/([0-9]+)$
RewriteRule ^ /book.php?id=%1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]