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