Назад | Перейти на главную страницу

Правило .htaccess дает ошибку 500 для файла php

Я использовал ответ 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]