调度程序上的 Apache 重写规则

调度程序上的 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>

答案1

目前,当我这样做时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 获得了一个机会。

答案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]

相关内容