Dot-Htaccess

Dispatcher 上的 Apache 重寫規則

  • August 25, 2016

如何為兩者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_aliasRedirect指令是前綴匹配,它解釋了您不需要的重定向。

而且,不要混合來自 mod_alias (即RedirectMatchRedirect)和 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 有機會之前執行。

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