Apache-2.2

.htaccess 規則為 php 文件提供 500 錯誤

  • January 28, 2016

我使用了 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這樣的 url來實際拉起http://myserver.php/login.php 這工作正常。但是當我嘗試呼叫http://myserver.com/book.php?id=1234時出現 500 錯誤, 這是怎麼回事?

你的問題似乎有相互矛盾的陳述,但假設這個陳述

我希望對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]

引用自:https://serverfault.com/questions/752265