.htaccess 规则导致 php 文件出现 500 错误

.htaccess 规则导致 php 文件出现 500 错误

我使用 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]

注意下面两行允许我使用类似http://myserver.php/login真正拉起来http://myserver.php/login.php 这工作正常。但是当我尝试调用时,出现了 500 错误http://myserver.com/book.php?id=1234 怎么了?

答案1

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

我想要请求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]

答案2

我刚刚在本地测试了它,它有效。确保您的 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]

相关内容