2012-10-04 152 views
1

我一直在努力與我的.htaccess文件數週,我改變了很多次,但它不會工作。htaccess不工作重寫規則

我有這個在我的.htaccess文件:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^/([^./]+)\.html$ category.php?id=$1 
RewriteRule ^/([^./]+)\.html$ tag.php?id=$1 
RewriteRule ^/([^./]+)\.html$ play.php?id=$1 

,但它不工作。

回答

0

你確定在Apache中打開了mod_rewrite嗎?你有訪問httpd.conf?最好是在那裏做重定向,而不是使用.htaccess文件。

0
  1. 您的條件僅適用於第一條規則。每套RewriteCond只適用於緊接的RewriteRule。所以條件只適用於RewriteRule ^/([^./]+)\.html$ category.php?id=$1,最後2條規則完全沒有條件。

  2. 您的條件是將的某些東西重寫爲,這會導致重寫循環。你可能想:

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    
  3. 你的第二和第三個規則將永遠不會被應用,因爲如果有人請求/some-page.html第一條規則的正則表達式匹配並重寫的URI到/category.php?id=some-page,那麼接下來的規則永遠不會匹配因爲第一條規則已將URI重寫爲category.php

  4. 你的正則表達式匹配一個斜線,因爲是一個htaccess文件中重寫規則被應用於URI的擁有領先的斜線剝離出來,所以你要這個:

    RewriteRule ^([^./]+)\.html$ category.php?id=$1 
    

1, 2和4很容易。 3,不是那麼多。你將不得不找出一個獨特的方式來表示一個HTML頁面作爲一個類別,標籤或播放。你不能讓所有3看起來完全相同,沒有辦法告訴你想要哪一個。採取:

/something.html 

這應該是一個類別?標籤?還是玩?誰知道,你的重寫規則肯定沒有。但是,如果你有一個關鍵字前言每次,那麼你就可以區分:

/category/something.html 
/tag/something.html 
/play/something.html 

而且你的規則看起來像:

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^category/([^./]+)\.html$ category.php?id=$1 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^tag/([^./]+)\.html$ tag.php?id=$1 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^play/([^./]+)\.html$ play.php?id=$1