2017-02-12 4 views
0

У меня есть следующие .htaccess конфигурации для моих двух версий моего сайта (в/oldsite и/NewSite соответственно):301 правило редиректа нарушает предыдущие правила

RewriteEngine On 

# load newsite if not newsite and not oldsite 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule ^((?!(?:newsite|oldsite)).*)$ newsite/$1 [NC,L] 

# load root if request is oldsite 
RewriteRule ^oldsite(/.*)?$ /$1 [L,NC] 

# certain urls need to be loaded in page.php 
RewriteRule ^newsite/(products|services|news|pages)/([a-zA-Z0-9_.-/]+)$ /newsite/page.php?type=$1&var=$2 

#remove trailing .php 
RewriteRule ^newsite/([a-zA-Z0-9_-]+)$ /newsite/$1.php [NC,L,QSA] 
RewriteRule ^newsite/admin/([a-zA-Z0-9_-]+)$ /newsite/admin/$1.php [NC,L,QSA] 

Теперь я хочу, чтобы сделать большую часть 301 перенаправлять для всех не-www запросы на WWW, а также 301 переадресацию на URL-адрес без привязки. Например:

  • www.example.com/// ->www.example.com
  • example.com///// ->www.example.com
  • www.example.com/somepage// ->www.example.com/somepage

Я попытался добавить следующее в различных позициях в .htaccess:

RewriteCond %{HTTP_HOST} !^www\. 
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] 

Но это нарушает предыдущие правила. Например, ввод example.com приводит к www.example.com/newsite.

Вся конфигурация стала спагетти правил, и мне нужно как-то их очистить.

ответ

0

Ваш редирект, не связанный с WWW-WWW, должен находиться в самой верхней части вашего файла .htaccess. В противном случае запрос для хоста, отличного от www, который инициирует внутреннюю переписку (например, до newsite/$1), может быть преобразован в перенаправление, что, как представляется, происходит здесь (когда вы перенаправлены на www.example.com/newsite). Как правило, перенаправления всегда должны появляться перед перезаписыванием. Тогда не должно быть конфликтов.

www.example.com/// ->www.example.com

Строго говоря, всегда есть один слэш в конце имени хоста (или, вернее, в начале URL-путь), это только, что браузер часто опускает его в адресной строке. Это отличается от косых черт на конце конца URL-адреса, который можно полностью опустить.

# Remove multiple slashes anywhere in the URL-path 
RewriteCond %{THE_REQUEST} //+ 
RewriteRule (.*) /$1 [R=301,L] 

директива RewriteCond просто проверяет наличие нескольких косых черт где-нибудь в URL-пути (из первоначального запроса). Переадресация затем основывается на том факте, что Apache автоматически обрезает множественные косые черты в URL-пути, который сопоставляется шаблону и использует это (backreference) в замене. Это также уменьшит запрос для www.example.com////<whatever>////<something>//// до www.example.com/<whatever>/<something>/.

Затем, чтобы удалить слэш в конце (или любое количество слешей):

# Remove trailing slash(es) 
RewriteRule (.*)/$ /$1 [R=301,L] 
+0

Перенаправление работает, но положить что-то вроде '' example.com /// не удаляет конечные косая черта. Он забирает меня на мою 404 страницу. Вот моя вся конфигурация после внесения ваших предлагаемых изменений: http://pastebin.com/U6aVmJC7 – Chris

+0

Директивы _should_ удалили трейлинг-косые черты на 'example.com ///'. Убедитесь, что кеш браузера очищен.(Вам все равно потребуется ваша первоначальная переадресация WWW в верхней части вашего скрипта, как упоминалось выше.) Я обновил свой ответ, чтобы разрешить более общий сценарий - сокращение косой черты _anywhere_ в URL-адресе. Что касается вашего сервера, то имеет значение, является ли запрос для 'example.com /' или 'example.com ///' - они оба разрешают одно и то же. Получает ли 'example.com /' результат 404? Согласно вашим директивам это будет переписано в '/ newsite /' - это действительно? – MrWhite

Смежные вопросы