Dot-Htaccess
Dispatcher 上的 Apache 重寫規則
如何為兩者
http://example.com/abc
重寫/重定向到重寫規則,http://example.com/abc.html
但是當我將 URL 設置為http://example.com/abc/def.html
. 目前,當我這樣做時redirect 301 "abc" "abc.hml"
,第二個 URL 也重定向到http://example.com/abc.html/def.html
.我現在的規則。
<IfModule rewrite_module> RewriteEngine On RewriteRule ^/$ /content/aaa-123/abc.html [PT,L] RewriteRule ^/index.html$ /content/aaa-123/abc.html [PT,L] RedirectMatch ^/abc$ /abc.html RewriteCond %{REQUEST_URI} !^/(.*)/$ RewriteCond %{REQUEST_URI} !^(.*)\.(.*)$ RewriteRule ^/(.*)$ /content/$1/ [L] RewriteRule \.(css|jpe?g|gif|png|js)$ - [L] ErrorDocument 404 /errors/404.html <IfModule mod_expires.c> ExpiresActive on ExpiresByType image/jpg "access 1 year" ExpiresByType image/jpeg "access 1 year" ExpiresByType image/gif "access 1 year" ExpiresByType image/png "access 1 year" ExpiresByType text/css "access 1 month" ExpiresByType text/html "access 1 month" ExpiresByType application/pdf "access 1 month" ExpiresByType text/x-javascript "access 1 month" ExpiresByType text/css "access plus 1 year" ExpiresByType application/x-shockwave-flash "access 1 month" ExpiresByType image/x-icon "access 1 year" ExpiresDefault "access 1 month" </IfModule> <IfModule mod_headers.c> <FilesMatch "\.(js|css|xml|gz)$"> Header append Vary: Accept-Encoding </FilesMatch> </IfModule>
目前,當我這樣做時
redirect 301 "abc" "abc.hml"
,第二個 URL 也重定向到http://example.com/abc.html/def.html
.mod_alias
Redirect
指令是前綴匹配,它解釋了您不需要的重定向。而且,不要混合來自 mod_alias (即
RedirectMatch
和Redirect
)和 mod_rewrite (即RewriteRule
)的重定向。由於它們是不同的模組,它們在不同的時間執行(通常是 mod_rewrite 首先),而不管明顯的順序如何,因此您最終可能會遇到令人困惑的衝突。在您的伺服器配置中嘗試以下操作,以在內部重寫
/abc
為/abc.html
RewriteRule ^/abc$ /abc.html [L]
但是,如果
/abc
是文件系統上的物理目錄,您將遇到問題,因為 mod_dir 通常會嘗試通過附加斜杠來“修復” URL。因此,您需要使尾部斜杠可選:RewriteRule ^/abc/?$ /abc.html [L]
此外,
MultiViews
如果已啟用,請禁用:Options -MultiViews
MultiViews
(mod_negotiation 的一部分)做同樣的事情(內部重寫/abc
或/abc.html
或/abc.php
它找到的任何東西),但會在mod_rewrite 有機會之前執行。