Как я могу сделать правило перезаписи для обоих 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 получает шанс.
Это сработало для меня. Кто-то помог мне в этом на сайте.
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]