2013-02-19 104 views
1

我想將某個目錄下的合法目錄名重定向到PHP文件。我發現this answer,這似乎是說,我可以做這樣的事情在根的.htaccess:將嵌套目錄重定向到.php

RewriteEngine on 
RewriteRule /([^/]+) processDir.php?dir=$1 [B,QSA] 

我想這就是我要找的,但有一個辦法:

  • 將它限制在目錄中,但允許嵌套目錄?
  • 僅篩選目錄:我不想處理文件。

回答

0

我打算刪除這個問題,但有人收藏它,所以我會回答它。

使用像一個.htaccess這個

RewriteEngine on 
RewriteRule ([^/]*)/$ processDir.php [B,QSA] 

,然後你可以processDir.php這個變量來使用GET而不是:

<? 
dir is <?php 
echo $_SERVER["REQUEST_URI"]; 
?> 

我對正則表達式提出的主要修改(稍後有人會修正)是堅持在字符串的末尾加上斜線。

2

我想你要找的是RewriteCond,它可以讓你有條件地應用重寫規則。這一次檢查,如果事情是一個目錄:

RewriteCond %{REQUEST_FILENAME} -d 

你放在RewriteRule上面使用它,像這樣:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule /([^/]+) processDir.php?dir=$1 [B,QSA] 

這將無論是在你的問題的方法或你的答案工作,需要注意的重要一點是,在應用規則之前,-d標誌首先檢查請求是否爲有效的目錄,這是您似乎想要的。

從我收集的內容來看,問題的第二部分是關於嵌套目錄。你的正則表達式,特別是只查找一個目錄(不用斜槓)。如果你想改變,你可以做這樣的事情:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule /?some_dir/(.*) processDir.php?dir=$1 [B,QSA] 

這將需要以下some_dir任何有效目錄和飼料是到PHP文件。

要注意的最後一件事是,你不需要把所有這一切都放到你的根.htaccess文件中。您可以將.htaccess文件放入您要重寫的目錄中。這樣或那樣做沒什麼區別,但我發現它可以簡化語法,如果你不確定你在做什麼。

+0

太棒了,謝謝。 +1,現在我有機會嘗試這一切,我會回覆評論(或者接受這個)。 [B,QSA]做什麼(當然,你也可以鏈接到某些東西)? – 2013-02-20 18:06:13

+1

@Y B用於轉義,QSA用於查詢字符串。雖然,我只是單單從你的帖子中找到那些人。更多細節請參見http://httpd.apache.org/docs/current/rewrite/flags.html – 2013-02-21 00:26:28