Apache-2.2

如何僅使用 htaccess 和 apache 從 /page 重寫到 /xx/page?

  • July 2, 2014

想像一個三步跳體育賽事,前兩步完美到位,第三步發射到空中,永遠不會回來,最終崩潰!這就是這個問題歸結為:)

/somepage?ln=xx第 1 步:當使用者導航到 時,WORKS服務/xx/somepage

# if user inputs nice urls /xx/somepage  to serve page /someapge?ln=xx
RewriteRule ^([a-z][a-z])/(.*) /$2?ln=$1 [L]

第 2 步:當只給出語言時,WORKS轉到首頁 /xx/

# if language xx given but no page given? then redirect to its home /xx/home
RewriteRule ^([a-z][a-z])/?$ /$1/home [R=301,L]

第 3 步:崩潰

# if user inputs /somepage then redirect to default english: /en/somepage
# if user inputs /somepage?ln=xx redirect to nice url /xx/somepage
RewriteCond %{REQUEST_URI} !^/../ [NC]
RewriteRule ^(.*)$ /en/$1 [R=301,L]

第三條規則是我們被卡住的地方…… PS:重定向應該適用於無副檔名文件somepage?ln=xx以及副檔名somepage.abc?ln=xx的文件,其中副檔名可以是任何 2 或 3 個字元- word,或者如果更簡單,請使用我使用的以下副檔名手動檢查

$$ .php .uu .u3c .vls $$ 感謝一千!

這確實有效(經過測試):

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

Apache Mod_Rewrite 文件重寫指南高級重寫指南

編輯:

測試了上面的(它和以前一樣);適用於我的 Apache 2.2 伺服器。

編輯2:

應該沒問題,只需要這樣的東西:

# If just the language is specified (ie example.com/en)
RewriteCond %{REQUEST_URI} ^/..$ [NC]
RewriteRule ^(.*)$ $1/

# If no language subfolder, default to 'en'
RewriteCond %{REQUEST_URI} !^/../ [NC]
RewriteRule ^(.*)$ /en$1 [R=301]

# If no page specified, default to home.
RewriteCond %{REQUEST_URI} !^/../.+ [NC]
RewriteRule ^/(..) /$1/home.html [R=301]

# If no ln query, tack it on
RewriteCond %{QUERY_STRING} !ln= [NC]
RewriteRule ^/(..)/(.*) /$1/$2?ln=$1 [R=301]

注意:請注意您的 404 頁面可以正常工作。如果它不是無效的連結將結束在一個無限循環(即,404 頁面不會工作)。

注意 2:如果使用者輸入example.com/en,他們將被重定向到example.com/en/en?ln=en,因此請確保尾部斜杠在 URL 中,否則。

注意 3:如果你願意,你可以[R=301]從最後一條規則中刪除,然後使用者將看到example.com/en/home.html對頁面的請求實際上是example.com/en/home.html?ln=en. 但是,如果您的站點使用 GET 請求,這將不起作用。

編輯 3:

添加了另一個條件/規則對來擷取是否有人只輸入語言,而沒有尾部斜杠。

引用自:https://serverfault.com/questions/209428