2011-10-14 43 views
9

我想實現漂亮的URL的基本URL重定向,並且由於圖像,CSS等也駐留在相同的路徑我需要確保如果URL是訪問時沒有結尾的斜槓,它會自動添加。如何做mod_rewrite重定向到相對URL

這工作得很好,如果我把絕對URL是這樣的:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ http://www.mydomain.com/myParentDir/$1/ [R,nc,L] 

但如果我更改爲相對URL,這樣我就不必在每次我在文件夾中移動的東西的時間去改變它,這根本行不通。

這些是我嘗試了所有不工作,或重定向我喜歡的服務器的實際內部目錄路徑/的public_html/...:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ ./myParentDir/$1/ [R,nc,L] 

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ myParentDir/$1/ [R,nc,L] 

什麼是做了正確的方式URL重定向因此,如果用戶輸入類似:

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir 

他被重定向到(通過HTTP 301或302):

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir/ 

謝謝。

編輯:添加一些更多的細節,因爲它似乎並不清楚。 可以說我正在實施一個畫廊,並且我想要使用mod_rewrite製作漂亮的URL。 所以,我想有網址如下:

http://www.mydomain.com/somedir/galleries/cats 

這表明貓的縮略圖,同時:

http://www.mydomain.com/somedir/galleries/cats/persian 

其中顯示了從所有的貓,命名爲波斯的縮略圖一個圖像。 所以實際上的物理目錄結構和重寫情況如下:

http://www.domain.com/somedir/gallery.php?category=cats&image=persian 

所以我希望做的就是把/ somedir .htaccess文件,其捕捉到/畫廊製作和取決於所有請求以下是虛擬子目錄,用它們作爲重寫佔位符,用2重寫規則:

RewriteRule ^galleries/(A-Z0-9_-]+)/$ ./gallery.php?category=$1 [nc] 
RewriteRule ^galleries/(A-Z0-9_-]+)/+([A-Z0-9_-]+)$ ./gallery.php?category=$1&image=$2 [nc] 

現在的問題是,事實上,畫廊腳本需要一些CSS,JavaScript和圖片,位於http://www.domain.com/somedir/csshttp://www.domain.com/somedir/jshttp://www.domain.com/somedir/images

我不想硬編碼任何絕對URL,所以CSS,JS和圖片將被引用到使用相對URL(./css,./js,./images等)。所以我可以做重寫URL如下:

RewriteRule ^galleries/[A-Z0-9_-]+/css/(.*)$ ./css/$1 [nc] 

的問題是,由於http://www.domain.com/somedir/galleries/cats是一個虛擬目錄,上面只有當用戶類型的作品:

http://www.domain.com/somedir/gallaries/cats/ 

如果用戶省略了結尾的斜線mod_dir不會添加它,因爲實際上這個目錄實際上並不存在。

如果我把一個重定向重寫與它的工作絕對URL:

RewriteRule ^galleries/([A-Z0-9_-]+)$ http://www.mydomain.com/subdir/galleries/$1/ [R,nc,L] 

但我不希望有URL前綴硬編碼,因爲我希望能夠把這個在我想要的域名在我想要的子目錄,所以我想這:

RewriteRule ^galleries/([A-Z0-9_-]+)$ galleries/$1/ [R,nc,L] 

而是將其重定向到:

http://www.mydomain.com/home/myaccount/public_html/subdir/galleries/theRest 

這顯然不是我想要的。

編輯:進一步澄清

我正在尋找解決的辦法是避免硬編碼的域名或文件夾路徑在.htaccess。我正在尋找一種解決方案,如果我將.htaccess與其他腳本和資源打包在一起,無論用戶將其解壓到他的Web服務器上,它都可以直接使用。所有的作品都是這樣的,除了這個尾隨的斜線問題。

因此,任何涉及在任何方式下對父目錄或web服務器的路徑進行硬編碼的解決方案都不是我所期待的。

+0

@DoktorJ請問編輯我的帖子回答你的問題? –

+0

你應該選擇你接受的答案,如果這裏有任何幫助。 – sjas

回答

0

我不知道我是否完全理解你的問題。

由於mod_dir模塊(99%的機會擁有mod_dir模塊),在大多數Apache安裝中會自動執行尾部斜線重定向。

您可能需要添加:

DirectorySlash On 

但它的默認值。

所以。如果您訪問foo/bar並且bar不是foo目錄中的文件,而是一個子目錄,則mod_dir將執行重定向至foo/bar/

我唯一知道的可以打破這個的是Option Multiviews這可能是試圖在目錄中找到bar.php,bar.php,bar.a-mime-extension-knwon-by-apache。因此您可以嘗試添加:

Option -Multiviews 

並刪除所有重寫規則。如果你沒有得到這個默認的Apache行爲,你可能不得不看看mod重寫,但這就像使用核彈來殺死蜘蛛一樣。核彈的使用可能會相當敏感。

編輯: 對於斜線問題與國防部重寫你可以檢查此documentation howto,指出這應該工作:

RewriteEngine on 
RewriteBase /myParentDir/ 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+[^/])$   $1/ [R] 
+0

感謝您的回覆。但是,請記住,這些不是實際的目錄。這些在物理上不存在,並且只是用於漂亮URL的虛擬目錄。所以實際上URL:http://www.mydomain.com/somedir/myVirtualParentDir不存在。沒有它我得到的相關鏈接圖像等無效。 – jbx

+0

你爲什麼包含RewriteBase?這是我想避免的一點。我不想在我的.htaccess中對路徑進行硬編碼。我想要什麼東西適用於我所說的任何子目錄。這與在重定向中將完整路徑指定爲http://www.mydomain.com/myParentDir/沒有什麼不同,我不想這樣做。其餘部分與我原來的問題完全一樣,其中$ 1 /將重定向到實際的物理URL而不是虛擬URL。你所建議的只是重定向到物理myParentDir/theRest而不是/ myVirtualDir/theRest。 – jbx

+0

@jbx:閱讀鏈接,這必須放在頂層目錄,並適用於所有子子目錄。 – regilero

4

這裏是直接從Apache Documentation溶液(「尾隨斜線問題」下):

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+[^/])$   $1/ [R] 

這裏的a solution是測試REQUEST_URI爲結尾的斜線,然後將其添加:

RewriteCond %{REQUEST_URI} !(/$|\.) 
RewriteRule (.+) http://www.example.com/$1/ [R=301,L] 

這裏是another solution,讓您免除某些REQUEST_URI模式:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !example.php 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ http://domain.com/$1/ [L,R=301] 

希望這些幫助。 :)

1

威力工作:

RewriteRule ^myParentDir/[A-Z0-9_-]+$ %{REQUEST_URI}/ [NS,L,R=301] 

但是,我不知道爲什麼你認爲你需要這個的。只是讓你的CSS/JS /圖像文件重寫規則看起來像這樣:

RewriteRule ^galleries/([A-Za-z0-9_-]+/)*(css|js|images)/(.*)$ ./$2/$3 

,一切都應該工作得很好,無論瀏覽器是否請求/somedir/galleries/css/whatever.css/somedir/galleries/cats/css/whatever.css甚至/somedir/galleries/cats/persian/calico/css/whatever.css

Ps。這條規則的一個問題是,它阻止了任何畫廊名稱「css」,「js」或「圖像」。您可能需要通過命名這些虛擬目錄來解決這個問題,比如「.css」,「.js」和「.images」,或者使用其他與有效庫名稱不衝突的命名方案。

2

該規則應該爲任何不是真實文件/目錄的URL(也就是我相信,因爲Apache通常會爲現有目錄自動重定向而需要的)添加尾部斜線。

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+[^/])$ $1/ [L,R=301] 

編輯:

爲了防止Apache相對於文檔根目錄的路徑追加,你必須使用RewriteBase。因此,例如,文件夾中的意思是你的應用程序的根目錄,添加以下,它覆蓋的物理路徑:

RewriteBase/
+0

看來使用RewriteBase的技巧是同時具有前導*和*後綴斜線;例如,「/ foo /」而不是「/ foo」或「foo /」。 RewriteBase對我來說仍然有點挑剔,但最終它解決了。謝謝! –

相關問題