我怎样才能做一个重写规则http://example.com/abc
重写/redirect到http://example.com/abc.html
但它应该工作时,我的URL为http://example.com/abc/def.html
。 目前,当我redirect 301 "abc" "abc.hml"
,第二个URL也redirect到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也redirect到http://example.com/abc.html/def.html
。
mod_alias Redirect
指令是前缀匹配 ,它解释了你不希望的redirect。
而且,不要混合来自mod_alias(即RedirectMatch
和Redirect
)和mod_rewrite(即RewriteRule
)的Redirect
。 由于它们是不同的模块,所以它们在不同的时间执行(通常是mod_rewrite),不pipe显示的顺序如何,所以最终会产生令人困惑的冲突。
在服务器configuration中尝试以下内容, 将 /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获得机会之前执行。
这对我有效。 有人帮我在这个网站。
Options -MultiViews RewriteEngine On RewriteRule ^/abc/?$ /abc.html [NC,L,R=302] RewriteRule \.(css|jpe?g|gif|png|js)$ - [L,NC] RewriteRule ^/(index\.html)?$ /content/aaa-123/abc.html [PT,L,NC] RewriteCond %{REQUEST_URI} !^/(.*)/$ RewriteCond %{REQUEST_URI} !^(.*)\.(.*)$ RewriteRule ^/(.*)$ /content/$1/ [L]