2014-06-19 35 views
2

超鏈接所以我沒有的.htaccess專家,絕不是的,但我設法一起把這個代碼的網站我在做:mod_rewrite的與空間

Options -Indexes +Includes 
<IfModule mod_rewrite.c> 
RewriteEngine on 
RewriteBase/
RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::\2$ 
RewriteRule ^(.*)$ - [E=BASE:%1] 
RewriteRule ^\.htaccess$ - [F] 
RewriteRule ^$ /%{ENV:BASE}/index.php?id=home 
RewriteCond %{REQUEST_URI} !\.php$ [NC] 
RewriteCond %{REQUEST_FILENAME} !-s 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ $1 [R=301,L] 
RewriteRule ^([a-zA-Z0-9]*)$ /%{ENV:BASE}/index.php?id=$1 [QSA,L] 
</IfModule> 

它基本上改變www.example.com/some/dir/index.php?id=homewww.example.com/some/dir/home雖然前幾條規則創建了某種相對路徑值,所以我不必每次更改基礎文件夾就更改RewriteBase(這對於此項目很重要!)。

它的工作原理非常好,但現在我遇到了一個問題,在URL中必須有空格,如www.example.com/some dir/sub folder/home,這會弄亂一切。

如果你點擊頁面(例如「href="home"」)上的鏈接重定向到www.example.com/home,而不是www.example.com/some dir/sub folder/home一個404錯誤,很明顯(儘管它的工作原理如果沒有空格!)。我發現如果右鍵單擊>「將鏈接複製到剪貼板」,即使它在地址欄中顯示解碼版本,它也會成爲編碼版本www.example.com/some%20dir/sub%20folder/home但是如果您手動鍵入解碼版本www.example.com/some dir/sub folder/home它仍然正常工作。

空間和編碼似乎有問題。我如何讓我的超鏈接正常工作?

- 編輯 - 感謝張貼elcodedocle的教程中,我只是簡單地添加反斜線空間:^([a-zA-Z0-9/ ]*)$在最後一條規則正則表達式,即使它不是最好的方法。然後我注意到倒數第二條規則中的[L]標誌。我刪除它,因爲這不應該是最後的規則(不知道爲什麼它在那裏首先...),現在它的工作原理!那麼,有點...

現在,如果在URL的末尾有一個尾部的斜線,它將不再有效。 Probabply因爲除去在規則中[L]標誌的,但我不知道如何解決這個問題?

+0

'HREF =「/家」'是絕對的,這意味着'www.example.com/ home'。 'href =「home」'是相對的變體,意思是'www.example.com/some dir/sub folder/home'。 URI中的特殊字符不應該影響這個。 – DaveRandom

+0

請參閱http://stackoverflow.com/questions/5442658/spaces-in-urls。另外,關於你的'/ home'鏈接問題:通過讓'/'作爲'href'中的第一個字符,你告訴服務器你想要URL相對於你的根目錄'example.com'。如果你想在目錄樹中相對於你當前位置的'home',那麼只需使用'home'而不用前導'/'。或者,如果您希望鏈接始終指向'/ some dir/sub folder/home',無論您身在何處,請將其用作您的'href'。 – Benjam

+0

哦,該死的,對不起,實際上在代碼中沒有任何'/'''之前,只是一個錯字。但是,如何告訴mod_rewrite如何處理這些編碼空間呢?對不起,如果這是一個愚蠢的問題,但我似乎不明白*爲什麼*它不會在URL中的空格。 –

回答

2

有你。 htaccess是這樣的:

Options -Indexes +Includes -MultiViews 

<IfModule mod_rewrite.c> 
RewriteEngine on 

RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::\2$ 
RewriteRule ^(.*)$ - [E=BASE:%1] 

RewriteCond %{REQUEST_URI} !\.php$ [NC] 
RewriteCond %{REQUEST_FILENAME} !-s 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ %{ENV:BASE}$1 [R=302,L,NE] 

RewriteRule ^\.htaccess$ - [F] 

RewriteRule ^$ /%{ENV:BASE}/index.php?id=home [L,QSA] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.+?)/?$ %{ENV:BASE}index.php?id=$1 [QSA,L] 
</IfModule> 

這是你在你的問題一樣處理空間中描述的所有測試用例下工作正常,尾隨斜線等

+0

太好了,謝謝! –

+0

不客氣,很高興它解決了。 – anubhava

1

嘗試改變:

RewriteRule ^([a-zA-Z0-9]*)$ /%{ENV:BASE}/index.php?id=$1 [QSA,L]

RewriteRule ^([a-zA-Z0-9%]*)$ /%{ENV:BASE}/index.php?id=$1 [QSA,L]

(這是一個瘋狂的猜測,但這是你的規則中唯一與%有關的問題)

[編輯]未編碼空格are not allowed in URIs。禁止空格由所有瀏覽器強制執行,因爲它們會在通過http協議發送請求之前將每個空間轉換爲%20。處理它們中的mod_rewrite一種解決方法上this tutorial描述:

由於URL中不能有空格(除20%),使用強調或 連字符替換它們。如果絕對必須使用 中的空格(%20),則可以將它們包含在範圍 範圍內的正則表達式中作爲{空間},即([a-zA-Z \] +)。但是,建議不是 。

[EDIT2]如果不工作,你可能不得不%20轉化爲空格,則應用其他規則。這是基於this answer您可以嘗試一個黑客:

sedspace.sh

#!/bin/sh 
sed -u 's/%20/ /g' 

.htaccess

... 
RewriteMap sed-space prg:sedspace.sh 
RewriteRule ^(.*)$ ${sed-space:$1} 
... 

(確保sedspace.sh是可執行的)

+0

我之前嘗試過,並再次嘗試,但不幸的是,沒有任何變化。這也是我的第一次猜測。 –

+0

找到了解決該問題的教程,並根據其建議編輯了我的答案。 – NotGaeL

+0

根據教程建議,看起來你會得到%20而不是空格,你必須在應用其他規則之前用空格替換它。我已經相應地再次更新了我的答案。 – NotGaeL