.htaccess перезаписывает, не работает после миграции с Windows server

#php #apache #.htaccess #mod-rewrite

#php #apache #.htaccess #мод-перезапись

Вопрос:

Хорошо, итак, я разрабатывал сайт для своего работодателя во вложенной папке одного из других их живых сайтов. Структура URL в разработке была http://our-live-site.net/our-dev-site.com/index.php . Сервер разработки работает в Windows, и новый сервер, на который я его только что перенес, является * nix-сервером Apache. Я не совсем уверен, связано ли это с отсутствием дополнительного каталога впереди или это разница в Windows / Linux в том, как они анализируют файл .htaccess. Я склонен верить первому, а не второму, проведя небольшое исследование по этому вопросу. У меня есть только 3 правила в моем файле .htaccess, и я выделил проблему для последних двух, перезаписей.

     <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteRule ^(inc/ajax|inc/pages|js|fonts|moving-tips)($|/) - [L]

->    RewriteRule ^(.*).php template.php?page=$1 [NC]
->    RewriteRule ^(.*).php template.php?location=$1 [NC][QSA]
    </IfModule>
 

Что мне нужно сделать, это передать все запросы, чтобы сказать http://new-site.com/some-page.php http://new-site.com/template.php?page=some-page . Мне также нужно сохранить возможность захвата другого $_GET var для наших страниц местоположения (они используют другой шаблон), следовательно RewriteRule ^(.*).php template.php?location=$1 [NC][QSA] , после первой перезаписи. У меня такое чувство, что я упускаю из виду что-то действительно простое с этим, в основном из-за… ну, простота правил. Любая помощь будет оценена по достоинству, я уверен, что это просто вопрос о том, чтобы взглянуть на это свежим взглядом.

Комментарии:

1. И ваша точная проблема… что? Что эти правила делают сейчас, чего вы не хотите?

2. Ну, когда я повторяю его содержимое $_GET['page'] , оно всегда возвращается как «шаблон». Итак, по-видимому, правило формирует какой-то цикл и всегда перезаписывает as template.php?page=template вместо того, чтобы говорить template.php?page=about-us , когда я пытаюсь получить доступ http://new-site.com/about-us.php

3. Да, если вы не прекратите перезапись с [L] помощью любого правила перезаписи, совпадения с которым будут запускаться и перезаписываться. Ваше первое правило превратится /blah.php into template.php?page=blah , и второе правило запустит, извлечет template и превратит его в template.php?location=template`.

4. Но если я добавлю флаг последнего правила ко второй перезаписи, он не добавит вторую $_GET переменную в конец. Есть ли какой-то другой способ обойти это? И если да, то почему эти правила должны работать на сервере разработчиков только потому, что сайт был расположен в подкаталоге?

5. На самом деле я только что заметил, что если я закомментирую последнее правило, оно все равно делает то же самое, т.Е. $_GET['page'] По-прежнему показывает «шаблон». Странно…

Ответ №1:

Попробуйте:

 RewriteCond %{REQUEST_URI}   !^/template.php
RewriteRule ^(.*).php template.php?page=$1amp;location=$1    [NC,L]
 

чтобы заменить оба этих RewriteRules

Происходит то, что когда apache перезаписывает, он перенаправляет внутренне, и переписанный путь передается ОБРАТНО по всем правилам, останавливаясь только тогда, когда переписанный путь (не строка запроса) совпадает с неписаным путем.

Комментарии:

1. Джон Лин, спасибо! Вот и все. Марк Б., также спасибо, я все еще новичок в использовании .htaccess, и такие ребята, как вы, постоянно помогают мне учиться :]