簡體   English   中英

通過 .htaccess 從 URL 中刪除雙斜杠不起作用

[英]Removing Double Slashes From URL By .htaccess does not work

為什么這些解決方案都不能在我的 Apache 服務器上運行:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule ^(.*) $1 [R=302,L]

或者

RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule . %1/%2 [R=302,L]

或者

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=302,L]

在我嘗試過的其他人中。

我嘗試了此頁面中的所有解決方案: .htaccess 從 URL 中刪除雙或更多斜杠時出現問題

以及其他頁面。

問題是 htaccess 中的規則與上述模式中的雙斜杠不匹配。

我也嘗試了“文字”模式,沒有正則表達式模式的精確網址。 依然沒有。 但是用一個斜線 - 一切正常。

Apache 發現時似乎有問題:“//” - 顯然無法識別 url 並且省略了規則。

這個想法很簡單:去掉雙斜線並用一個斜線替換它們:

 http://demo.codesamplez.com/html5//audio -> http://demo.codesamplez.com/html5/audio

您知道如何將帶有雙斜杠“//”的 URL 重定向到單個“/”嗎?

這是 htaccess(刪除了文件中最長的注釋):

<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On


RewriteCond %{REQUEST_URI} ^/test//slash
RewriteRule ^(.*)$ /test/slash [R=302,L]


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

# Sets the HTTP_AUTHORIZATION header removed by Apache
RewriteCond %{HTTP:Authorization} .
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^app\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]

# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# Rewrite all other queries to the front controller.
RewriteRule ^ %{ENV:BASE}/app.php [L]
</IfModule>

在任何現有的重寫之前,請在根.htaccess文件的頂部附近嘗試以下操作:

# Remove multiple slashes anywhere in the URL-path
RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule (.*) /$1 [R=302,L]

這利用了在與RewriteRule模式匹配的 URL 路徑中已經減少了多個斜杠的事實。 並且對THE_REQUEST的檢查(它包含請求標頭的第一行並且在整個請求中不會更改)確保多個斜杠最初出現在 URL 路徑中的某處(不包括查詢字符串)。

另一個潛在問題是,如果您的應用程序 (Apache) 服務器前面有一個代理服務器(或負載平衡器),這可能是在將請求轉發到您的應用程序時規范化請求(減少多個斜杠、刪除尾隨空格等) (阿帕奇)服務器。 然后,應用程序服務器永遠不會看到您在瀏覽器中看到的原始請求(帶有多個斜杠)。


看着你的嘗試...

 RewriteCond %{REQUEST_URI} ^/test//slash RewriteRule ^(.*)$ /test/slash [R=302,L]

這個“應該”工作,發布的例子有限。 但是, REQUEST_URI服務器變量在整個請求過程中都會被修改,因此如果 URL 已經被修改(可能在服務器配置中),那么這可能不匹配。

 RewriteCond %{THE_REQUEST} ^[AZ]{3,}\s/{2,} [NC] RewriteRule ^(.*) $1 [R=302,L]

這僅匹配 URL 路徑開頭的多個斜杠,而不是 URL 路徑中的任何位置。 如果在.htaccess中使用,這也會導致格式錯誤的重定向(除非您還設置了RewriteBase指令)。 如果替換字符串上沒有斜杠前綴,則此規則可能適用於服務器虛擬主機上下文,而不是.htaccess

 RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$ RewriteRule . %1/%2 [R=302,L]

與上面提到的使用REQUEST_URI相同的問題。 否則,這應該有效。 但是,如果有超過 1 組的多個斜杠,則會導致多次重定向。 例如。 //foo//bar .

 RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ RewriteRule . %1/%2 [R=302,L]

與上面相同,除了這僅匹配雙斜杠,而不是兩個或多個斜杠的組。 因此,如果一個組中有兩個以上的斜杠,則會導致多個重定向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM