2011-03-25 36 views
8

問題:一些PHP頁面的等效(apple.html,apple.php; orange.html,orange.php),但不是所有的(grapes.html)。htaccess重寫,如果重定向文件存在

目標:如果php版本存在,重寫,否則保留html版本。

我:

Options +FollowSymLinks 
RewriteEngine on 
RewriteRule ^(.*)\.html$ /$1.php [R] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)\.php$ /$1.html [R] 

有趣的問題:

如果我不把/在$ 1.PHP前然後我結束了:site.com/document/root/path(即:site.com/home/user/www/file.php)

當調用第二個RewriteRule時,我得到http://site.com/http:/site.com/page.html,它告訴我有太多的重定向。注意第二個http中只有一個/。

我已經取得了一些進展,我添加了RewriteBase /,並在$ 1之前刪除了/,但仍然收到了太多的重定向錯誤(網站site.com/page.html導致了太多重定向清除您的Cookie或允許使用第三方Cookie可能會解決問題,否則可能是服務器配置問題,而不是計算機問題)。

看來,如果我只是重寫HTML - > PHP - > HTML我得到了同樣的錯誤。所以它看起來像邏輯工作,但這種邏輯是不允許的。我想不出任何其他方式可以看到文件的「php版本」是否存在?我認爲這是唯一的方式做類似的東西:

RewriteCond ^(.*)\.html$ $1.php -f 
RewriteRule ^(.*)\.html$ $1.php [R] 

不幸的也並非完全奏效(我猜是因爲它對狀態行三段)。我試圖讓名不帶擴展名,然後說,如果filename.php是一個文件,重寫page.html中到page.php文件

回答

13

你應該能夠實現,通過使用兩個條件:

RewriteCond %{REQUEST_FILENAME} (.*)\.html$ 
RewriteCond %1\.php -f 
RewriteRule ^(.*)\.html$ $1.php [R,L] 

第一個條件檢查文件名是否以.html結束,第二個條件使用第一個條件中的反向引用%1來檢查.php版本是否存在。

希望它有幫助。 :)

+0

當我第一次讀到您的電子郵件,我很喜歡啊哈哈!然後我嘗試了它,但沒有效果:(即使php存在,它仍然會去page.html。在第二個RewriteCond中,你是否意味着$ 1而不是%1? – user677285 2011-03-30 14:25:35

+0

我剛剛在我的apache上測試過,它工作正常。你使用的是httpd.conf還是.htaccess?如果有其他的重寫規則,你會發布所有重寫規則嗎?%符號應該用在RewriteCond中,$用在RewriteRule中,至少這是我記得的。 – szemian 2011-03-30 14:35:56

1

我很抱歉回答sooooo晚了,但您將需要添加RewriteBase指令,使其工作。

我有同樣的問題(與您的http:/ stufff)和固定這樣說:

RewriteBase /your/application_path 
RewriteCond %{REQUEST_FILENAME} (.*)\.html$ 
RewriteCond %1\.php -f 
RewriteRule ^(.*)\.html$ $1.php [L] 

希望這將有助於!

0

我也想將所有.html請求重寫爲.php文件,但前提是.php文件存在。但我的變化是,只有當實際的.html文件不存在時纔會發生這種情況。

所以只有對不存在的.html文件的調用重寫爲.php文件,如果它們通過這些規則存在:(我也在XAMP本地服務器上測試了這一點,並且還測試了這個成功的Apache在線服務器! )

# Rewrite rules to .html file to .php if the .php version 
# does actually exist. 

RewriteCond %{REQUEST_FILENAME} (.*)\.html [NC] 
RewriteCond %{REQUEST_FILENAME} !-f [NC] 
RewriteCond %1\.php -f [NC] 
RewriteRule ^(.*).html$ $1.php [NC] 
  1. 它首先檢查所請求的文件是一個。html文件(我們不希望.jpg,.css,.pdf等被重寫)。
  2. 它檢查.html文件是否不存在。 (如果它確實存在,我們不想重寫爲.php)。
  3. 然後檢查.php版本是否存在(我們不想重寫爲不存在的.php文件)。
  4. 然後重寫的.html到.PHP
相關問題