2013-02-04 54 views
1

我最近將我網站上的文件擴展名從.html切換到.php。因此,我希望做到以下幾點:將.html文件重定向到.php等效文件並且不顯示任何文件的.php擴展名

  1. 重定向.html文件到他們.PHP等效

  2. 所有網址中刪除.php擴展

  3. 擴展名的網址應工作(例如,foo.com/bar應顯示頁面位於foo.com/bar.php)

這是我目前的方法,我從各種工具拼湊在一起來源:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)\.html$ $1.php [L] 
RewriteRule ^([^\.]+)$ $1.php [NC,L] 

我的方法至少有三個問題:

  1. 當一個人試圖訪問foo.domain/bar.php,php擴展遺體(不過,值得注意的是,foo.domain /條確實顯示正確的PHP頁面)

  2. 雖然.html文件請求做顯示正確的PHP頁面,.html擴展名遺體(我想沒有擴展DISPLA Y)

  3. 它現在無法訪問目錄,而不包括在URL中的index.php(例如,foo.com/bar/拋出一個404錯誤)

由於必須是顯而易見的,我找到了mod_rewrite真的很難。任何幫助,將不勝感激。

回答

0

我的頭

RewriteEngine On 
RewriteBase/
Options -MultiViews 

# redirect /foo.html to /foo 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^\.]+)\.html$ $1 [L,R=302] 

# redirect /foo.php to /foo 
RewriteCond %{THE_REQUEST} \.php 
RewriteRule ^([^\.]+)\.php$ $1 [L,R=302] 

# rewrite /foo to /foo.php if and only if /foo.php exists 
RewriteCond %{DOCUMENT_ROOT}/$1.php -f 
RewriteRule ^([^\.]+)$ $1.php [NC,L] 
+0

非常感謝您的幫助的頂部!我試了一下你的代碼,這是我發現的。 規則#1和#2都可以工作(foo.com/bar.html和foo.com/bar.php都會重定向到foo.com/bar)。但是,#3不起作用。相反,服務器繼續尋找文件的無擴展版本。 此外,我的描述是誤導性的,我似乎在說所有的文件都在根。他們不是。因此,我相信DOCUMENT_ROOT不應該成爲規則#3的一部分。對不起,誤導你。 (但是,我在根目錄下運行了文件測試,看看是否DOCUMENT_ROOT是問題所在) – mbarrish

+0

我一定是一直在使用PHP太多。 「{$ 1}」應該是「$ 1」。我編輯了上面的代碼。對於那個很抱歉。由於你在子文件夾中,你應該使用'RewriteCond%{DOCUMENT_ROOT} /子文件夾/ {$ 1} .php -f'。另外請確保也更新'RewriteBase /子文件夾'。 – Gerben

+0

再次感謝您的幫助@Gerben。可悲的是,有些東西仍然不對,因爲我仍然收到一個404錯誤,表明服務器正在尋找.php文件的無擴展版本。另外,我應該更清楚目標.php文件的位置;他們不在任何一個特定的目錄,但在網站上的任何地方。所以我認爲第三條規則的重寫條件應該更通用。 – mbarrish

相關問題