Apache-2.2
.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這樣的 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]