2012-03-21 74 views
1

顯然,我的.htaccess中的這些行會導致服務器輸出一個500而不是404錯誤,當嘗試訪問一個不存在的站點時應該出現這個錯誤。500內部服務器錯誤,而不是:404 - 未找到

RewriteEngine On 
# Don't rewrite requests to /de or other real files 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^.*/(css|scripts) 
# Rewrite incoming requests to their equivalent behind /de 
RewriteRule ^(.*)$ de/$1 [L,QSA] 

唉我很不熟悉.htaccess。在這個導致500而不是404錯誤的錯誤中,哪裏出錯?

這是在日誌文件中的錯誤:

請求超過了10個內部重定向限制由於可能配置錯誤。如果需要,使用'LimitInternalRecursion'來增加限制。使用'LogLevel debug'來獲得回溯。

編輯:

RewriteRule ^(.*)$ de/$1 [L,QSA]

這部分負責的錯誤。爲什麼它會阻止404錯誤頁面?

+1

似乎你已經產生了一個無限的重寫循環或類似的東西。 – 2012-03-21 17:09:20

+0

是的,這似乎是這種情況。該錯誤應該由上面的.htaccess引起,因爲沒有它,錯誤不會發生。但如何修復thix? – BlueHorizon 2012-03-21 17:13:51

+1

我不是'mod_rewrite'專家;我會嘗試[閱讀文檔](http://httpd.apache.org/docs/2.0/rewrite/),並註釋掉所有行,然後逐行開始評論,直到它打破。引用:「關於mod_rewrite的好處是它爲您提供了Sendmail的所有可配置性和靈活性。mod_rewrite的缺點是它爲您提供了Sendmail的所有可配置性和靈活性。」 – 2012-03-21 17:18:36

回答

2

該部分負責該錯誤。爲什麼它會阻止404錯誤頁面?

這不產生404錯誤頁面的原因是因爲防止盲目匹配被重寫爲de/的條件。

這些都是你有3個預防性條件:

# these prevent rewriting if the URI doesn't point to a resource 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 

# this prevents scripts from being rewritten 
RewriteCond %{REQUEST_URI} !^.*/(css|scripts) 

然而,沒有什麼阻止如果,例如,/de/blahblah不存在的重寫。因此,如果有人請求/blahblah,這是發生了什麼:

  1. URI = /blahblah
  2. 檢查第一condidion:blahblah不是目錄
  3. 檢查第二個條件:blahblah不是一個文件
  4. 檢查第三個條件:blahblah不是css或腳本
  5. 重寫爲/de/blahblah
  6. Rewr伊特發動機循環,URI = /de/blahblah
  7. 檢查第一condidion:de/blahblah不是目錄
  8. 檢查第二個條件:de/blahblah不是文件
  9. 檢查第三個條件:de/blahblah不是CSS或腳本
  10. 重寫到/de/de/blahblah
  11. 等等

您需要添加一組附加條件改寫IF目標存在:

RewriteCond %{DOCUMENT_ROOT}/de%{REQUEST_URI} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/de%{REQUEST_URI} -d 

因此,你應該有這樣的:

RewriteEngine On 
# Don't rewrite requests to /de or other real files 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^.*/(css|scripts) 
# make sure rewrite target actually exists as a file or directory 
RewriteCond %{DOCUMENT_ROOT}/de%{REQUEST_URI} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/de%{REQUEST_URI} -d 
# Rewrite incoming requests to their equivalent behind /de 
RewriteRule ^(.*)$ de/$1 [L,QSA] 

這樣, 404將返回,因爲沒有任何內容會被重寫入de/目錄。