2013-04-14 36 views
1

這是我的情況,我已經想知道如何做到這一點,它似乎對我來說太複雜了。我想改寫如下:htaccess動態文件夾重寫

http://demo.myurl.com/proevent/event1 to http://demo.myurl.com/index.php?url=proevent&path=event1 

http://demo.myurl.com/proevent/admin to http://demo.myurl.com/admin - when folders exist under that location I want to have them loaded and not falling to /index.php 

我們說「proevent」和「事件1」是完全動態!

我知道的文件夾肯定是:admin,inc,現有照片,其餘都是動態的。

在所有重定向的情況下,我想從路徑中知道已打開什麼,並給出錯誤消息。

這是我到目前爲止有:

跳過斜槓,因爲人們忘記把它和文件夾不存在

RewriteCond %{REQUEST_URI} !(\.|/$) 
    RewriteRule (.*) /$1/ [R=301,L] 
if dir/file exists (doesn't really work) 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ([^/]*)/(.*) /$2%{REQUEST_URI} [R] 

還當它的工作,因爲它不知道可能屬於以前的情況

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]*)/(/?.*?)([^/]*)$ index.php?url=$1&path=$2 [L] 

任何幫助表示讚賞!

+0

[提示調試.htaccess重寫規則提示](http://stackoverflow.com/questions/9153262/tips-for-debugging-htaccess-rewrite-rules) –

回答

0
RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} /([^/]*)$ 
RewriteCond %{DOCUMENT_ROOT}/%1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/%1 -d 
RewriteRule /(.*)$ /%1/ [L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]*)/(/?.*?)$ index.php?url=$1&path=$2 [L] 

會爲你做。

第一部分檢查整個目錄或子目錄是否爲文件,如果第一部分失敗,第二部分重定向。

更清晰

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 

檢查,看看這是否是一個真正的文件或dirctory開始。

RewriteCond %{REQUEST_URI} /([^/]*)$ 

根據您的請求獲取URL的最後部分。

RewriteCond %{DOCUMENT_ROOT}/%1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/%1 -d 

這些檢查是/(URL的最後部分)是文件或目錄。這使用Rewrite的反向引用功能。 %1引用RewriteCond中最後一個RegEx的第一個塊。

RewriteRule /(.*)$ /%1/ [L] 

如果它是一個目錄,我們重寫

否則,下部分是明顯的,只是重寫爲你奠定了的get條件。