2013-05-05 76 views
0

我一直試圖在我周圍的大部分時間使用.htaccess,但我一直在磕磕絆絆;我可以讓服務器使用一組規則,但一次只能使用一個。.htaccess - 重定向幾頁

我的應用程序是由幾頁:

  • 網頁內容中提取從詳細信息頁面,(以及該Detail頁面不包括內容),帶有可選的查詢字符串參數;例如?s=item-name
  • 詳細頁面拉在一個可選的查詢字符串參數的內容(相同的參數作爲主頁;如?s=item-name - 這將涉及到的內容完全相同)
  • 集錦頁面
  • A相關頁面

這些頁面中的每一個都是文檔根目錄(index.php,detail.php,collection.php,相關的php)中的一個php文件。

我想什麼來實現:

  • 的用戶應該能夠去mydomain.com/detail/mydomain.com/detail(所以允許尾隨斜槓)代替mydomain.com/details.php
  • 如果存在,查詢字符串參數(?s=item-name)應該在頁面的尾部斜線後面輸入(所以mydomain.com/item-name而不是mydomain.com/?s=item-name; mydomain.com/detail/item-name而不是mydomain.com/detail.php?s=item-name。這就是所有頁面的情況,所以在一個頁面上一次設置規則似乎相當麻煩......

這是我的.htaccess文件看起來像目前很多擺弄後:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteBase/
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ index.php?s=$1 [L] 
</IfModule> 

這使得網頁在正確的內容拉,我敢肯定,這不是太離譜,允許任何頁面做同樣的事情,但我不能相當揣測它。

任何人都可以幫忙嗎?

回答

1
RewriteEngine On 
RewriteBase/

# Specifics 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} ^/([^/]+)/(.+)/?$ 
RewriteCond %{DOCUMENT_ROOT}/%1.php -f 
RewriteRule^%1.php?s=%2 [L] 

# EDIT 1: This will also check for root pages. See notes below 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ([^/]+)/ $1 [R=301,L] 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule (.+) $1.php [L,QSA] 

# Everything else 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?s=$1 [L] 

說明:

  1. 首先,我們檢查了全REQUEST_FILENAME不存在。
  2. 然後,我們檢查看看格式如下:/<something-without-slash>/<everything else>(帶有可選的尾部斜線)。
  3. 然後我們檢查我們的第一個條件捕獲是否作爲PHP文件存在於文檔根目錄中。例如,如果我們請求foo/bar,它會檢查/foo.php是否存在。
  4. 然後,我們只需使用正確的查詢字符串將請求路由到正確的文件。

因此,在您的情況下,當您請求detail/item-name時,服務器實際上會查看detail.php?s=item-name爲您提供響應。

注意:如果它不存在,請求將簡單地發送請求到index.php

編輯:增加了對根頁面的檢測。但請注意,我無法讓它爲這種檢測留下斜線,因爲它會自動將.php修改爲空的s查詢參數。不知道爲什麼...... 這就是爲什麼當它到達這個階段時,它會刪除任何後面的斜線。這對於SEO評級/排名也很有用,因爲它被看作是一頁,而不是兩個重複。

+0

非常接近那裏,我想 - 但在此刻請求detail.php('mydomain.com/detail')被解釋爲index.php /?s = detail。 – MassivePenguin 2013-05-06 15:32:13

+0

錯過了,對不起。稍等片刻。 – 2013-05-06 15:33:13

+0

請參閱我的編輯。 :) – 2013-05-06 15:45:14