2013-09-21 28 views
0

今天,我寫了下面的重寫規則:改寫服務器之間的差異怪異

RewriteCond %{HTTP_HOST} ^visionale\.book [NC] 
RewriteRule ^\/([^/]+)\/$ $1.php [L] 

RewriteCond %{HTTP_HOST} ^(www\.)?visionale\.se [NC] 
RewriteRule ^(.*)/$ $1.php 

的冷杉是我的筆記本電腦,我運行Apache,對於網上的酒店第二條規則。

應用在網絡上搜索結果第一改寫在404未找到

應用在我的筆記本神祕地導致「pagename.php.php.php」第二條規則沒有找到。

現在我提供的解決方案可以在兩個地方工作,但我對真正發生的事情感到困惑。我的本地機器運行Apache 2.4.6。網絡酒店運行Litespeed。所以這當然是不相容的,但究竟是如何。

我的猜測是Litespeed由於缺少功能而錯過了第一條規則,但爲什麼Apache沒有獲得更容易的規則,我過去曾多次使用過?

編輯:澄清問題。

這條規則:

RewriteRule ^\/([^/]+)\/$ $1.php [L] 

是不是撿到我的網絡運行酒店的Litespeed。我的猜測是,這是因爲Litespeed有一個有缺陷的重寫實現。我希望得到確認的預感或其他解釋。

這條規則:

RewriteRule ^(.*)/$ $1.php 

不我開發機更多上工作,但它在過去工作過。這似乎很簡單。任何以斜線結尾的內容都應該得到一個「.php」擴展名。但是,在我的開發機器上,它增加了三個「.php」而不是一個。該規則在網絡酒店中按照預期工作,過去它在本地爲我工作。這令人費解,我想要一個解釋。

+0

兩個'RewriteCond'中使用的模式不同,所以你如何比較它們?你的問題不是很清楚,你能否請進一步解釋? –

+0

是的,他們在技術上有所不同,但他們取得了相同的結果。 foo /被重寫爲foo.php。 – itpastorn

+0

對於您的開發機器上的問題,請啓用重寫日誌 - 然後您可以準確回溯該規則的處理方式。 – CBroe

回答

0

這兩個規則都不正確。讓我爲你提供正確的代碼第一:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

RewriteCond %{HTTP_HOST} ^visionale\.book$ [NC] 
# If the request is not for a valid file 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/?$ $1.php [L] 

RewriteCond %{HTTP_HOST} ^(www\.)?visionale\.se$ [NC] 
# If the request is not for a valid file 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.+?)/?$ $1.php [L] 

現在在你的代碼中的問題:

  1. .htaccessRewriteRule不啓動與主要是由mod_rewrite
  2. 您需要斜線條紋匹配避免使用RewriteCond %{REQUEST_FILENAME} !-f來重新匹配這些規則,否則mod_rewrite將繼續在URI中添加.php
+0

我澄清了這個問題。 (1)在理論上你可能正確地剝奪了主要的斜線,但是在我的本地機器上,我提供的代碼在寫入時達到了期望的結果。不過,我會調查您的版本是否適用於網絡酒店。 (2)第二條規則可能非常需要附加條件。沒有它,它仍然有效,但在網絡酒店和我的本地機器上它已經工作過去了。 – itpastorn

+0

此外,如果在我遇到第二條規則時,mod_rewrite真的應該繼續添加「.php」幾次,我真的很想知道何時以及爲什麼會添加這種改變的行爲。 – itpastorn

+0

不太清楚它是如何爲你工作的,可能是因爲'Litespeed'。 Apache中的mod_rewrite行爲不同,它會通過您的規則再次注入結果URL,並且如果條件再次匹配,則再次應用規則。這就是爲什麼'RewriteCond%{REQUEST_FILENAME}!-f'被放置以便不使用後續應用程序的原因。 – anubhava