我如何才能为两者制定重写规则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>
答案1
目前,当我这样做时
redirect 301 "abc" "abc.hml"
,第二个 URL 也会重定向到http://example.com/abc.html/def.html
。
mod_aliasRedirect
指令是前缀匹配,这解释了您不希望的重定向。
但同样,不要混合来自 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 获得了一个机会。
答案2
这对我有用。有人在网站上帮助我。
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]