我有這樣的 URL 地址www.example.com/subfolder/index1,我想實作以下結果www.example.com/index1(見下文,我只有 2 個子檔案夾,我必須對兩者都做同樣的事情)。
我的專案中的檔案夾如下:
index.html (main page)
subfolder1 -> index1.html
subfolder2 -> index2.html
到目前為止,我的 htaccess 檔案中有以下代碼:
index.html
RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.] )\.html [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]
uj5u.com熱心網友回復:
通過擁有兩個“隱藏”子目錄(/subfolder1和/subfolder2),您造成了歧義。例如。應該將請求/foo重寫到哪里?應該是/subfolder1/foo.html還是/subfolder2/foo.html?確定這一點的唯一方法是首先檢查檔案是否存在于 中/subfolder1,否則重寫為/subfolder2.
您似乎也在使用無.html擴展名的 URL。而且您似乎在參考這兩個子檔案夾之外的檔案。
嘗試類似以下內容:
DirectoryIndex index.html
RewriteEngine On
# Redirect any direct requests for "/subfolder1" or "/subfolder2" back to the root
# - Except for "assets"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !^/[^/] /assets/
RewriteRule ^(?:subfolder1|subfolder2)(?:$|/(.*)) /$1 [R=301,L]
# Remove "index.html" entirely if requested
RewriteRule (^|. /)index\.html$ /$1 [R=301,L]
# Remove ".html" extension if requested directly
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^([^.] )\.html$ /$1 [R=301,L]
# Rewrite requests to subfolder1 if ".html" file exists in that subdir
RewriteCond %{DOCUMENT_ROOT}/subfolder1/$1.html -f
RewriteRule ^([^.] )$ subfolder1/$1.html [L]
# Rewrite requests to subfolder2 if ".html" file exists in that subdir
RewriteCond %{DOCUMENT_ROOT}/subfolder2/$1.html -f
RewriteRule ^([^.] )$ subfolder2/$1.html [L]
# Otherwise append ".html" if the file exists
# - Only required if you are serving other HTML files outside of the subfolders
# - (Excluding "/index.html" in the document root)
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^([^.] )$ $1.html [L]
幾個假設:
- 你的靜態資源(圖片,CSS,JS等)直接申請,包括
/subfolder1或/subfolder2在URL中。否則,解決/subfolder1和之間的所有歧義就會成為問題/subfolder2。然而,這確實意味著/subfolder1(或/subfolder2)并不是真正“隱藏”的。 - 您的無擴展名 URL 不包含點(否則會分隔檔案擴展名)。
注意:使用 302(臨時)重定向進行測驗以避免潛在的快取問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/354766.html
