.htaccess规则给php文件500错误

我用了一个stackoverflow的答案来想出我想要做的。 我想请求http://myserver.com/book/1234实际显示内容forms的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] 

注意底部的两行允许我使用像http://myserver.php/login这样的url实际上拉起http://myserver.php/login.php这是正确的。 但是当我尝试调用http://myserver.com/book.php?id=1234时出现500错误。

你的问题似乎有矛盾的陈述,但假设这种说法

我想请求http://myserver.com/book/1234实际显示内容forms的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不仅在请求有forms时进行重写

 some_URI?id=some_number 

但实际上只有当请求具有这种forms时,重写才会发生。
当请求是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] 

我只是在本地testing,它的工作原理。 确保你的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]