Назад | Перейти на главную страницу

Правило перезаписи 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>

В настоящее время, когда я делаю 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]