2012-08-01 124 views
2

如果字母中包含大寫字母,但如果它完全小寫(如果匹配,則會導致無限循環),則需要將其重寫爲小寫字母。Apache將小寫字母重寫爲

我想出了這一點,但很困惑,爲什麼它不工作:

# /MaTcHeD to matched 
RewriteCond %{REQUEST_URI} ^(?i)matched(\/.*)?$ 
RewriteRule ^[a-z]*[A-Z]+[^\/]*(\/.*)?$ /matched$1 [R=301,L] 

對我來說這表示,如果URL爲「一致」或「匹配」或「匹配」或「匹配」等。然後匹配如果在URL的開頭處有任何小寫字符([az]),後跟任何一個或多個大寫字符([AZ]),後跟任何非「/」字符,則匹配網址的其餘部分(可選「/」後面是其他任何內容)。如果這些條件是真的,那麼重定向到小寫「/匹配」。

我瀏覽過並看到許多匹配任何單詞的解決方案,但這會導致問題,因爲其他內容都是大寫的。在任何情況下,我只需要「匹配」,但全部小寫,重定向到全部小寫的「匹配」。

+0

任何不使用'RewriteMap'的理由? – 2012-08-01 15:26:42

+0

我使用RewriteMap進行了研究,但它只是小寫或大寫,沒有任何幫助。我需要匹配任何東西,只要它不全是小寫。 – Jim 2012-08-02 17:53:14

+0

然後在先前的規則中匹配所有小寫字母,並禁止重寫或跳過低分組規則。 – 2012-08-02 19:23:33

回答

1

你可以做一對夫婦檢查的覆蓋這一點,首先檢查它不是小寫都:

RewriteCond %{REQUEST_URI} !^(.*)/matched(.*)$ 

然後檢查,如果情況是通過使用[NC]標誌忽略同樣會匹配:

RewriteRule ^(.*)/matched(.*)$ /$1/matched$2 [R=301,L,NC] 

在這一點上,你知道不區分大小寫,matched匹配,但它不是全部小寫,所以你可以重定向到全部小寫。


我目前正在使用的比賽在htaccess的水平,所以我不需要初始「(。*)/」。使用它不起作用。 「匹配」是域名後的第一路徑部分

試試這個,然後:

RewriteCond %{REQUEST_URI} !^/matched(.*)$ 
RewriteRule ^matched(.*)$ /matched$1 [R=301,L,NC] 

的問題是%{REQUEST_URI}變量確實有斜線,但URI用於匹配RewriteRule沒有有一個(去圖)。

+0

Hm ...我使用RewriteCond%{REQUEST_URI}!^匹配(\ /.*)$ $和RewriteRule ^匹配(\ /.*)$ $ /匹配$ 1 [R = 301,L,NC]一個重定向循環。我正在使用目前在htaccess級別的匹配,所以我不需要最初的「(。*)/」。使用它不起作用。 「匹配」是域之後的第一個路徑部分。 – Jim 2012-08-02 17:13:21

+0

Apache中的重定向日誌沒有多大幫助。我把它設置爲max,它只是說它匹配「^匹配(\ /.*)?$」但沒有說別的。它甚至沒有說RewriteCond是匹配的。 – Jim 2012-08-02 18:44:50

+0

@Jim對不起,我更新了答案,您需要在'RewriteCond'中引用'/'。 – 2012-08-02 18:58:04