#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']
, оно всегда возвращается как «шаблон». Итак, по-видимому, правило формирует какой-то цикл и всегда перезаписывает astemplate.php?page=template
вместо того, чтобы говоритьtemplate.php?page=about-us
, когда я пытаюсь получить доступhttp://new-site.com/about-us.php
3. Да, если вы не прекратите перезапись с
[L]
помощью любого правила перезаписи, совпадения с которым будут запускаться и перезаписываться. Ваше первое правило превратится /blah.php intotemplate.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, и такие ребята, как вы, постоянно помогают мне учиться :]