2010-07-11 1 views
2

Здесь есть еще несколько вопросов по этой же теме, которые я прочитал, но мой немного отличается. Я пытаюсь сделать очень простой mod_rewrite:

RewriteEngine on 
RewriteRule ^go/([^/\.]+)/?$ /go.php?page=$1 

go.php выглядит следующим образом:

<?php 
ini_set('display_errors',1); 
if(isset($_GET['page'])){ 
    echo 'page='.$_GET['page']; 
}else{ 
    echo 'oh shnizzle!'; 
} 
?> 

Теперь, когда я иду в /go/someword в браузере, то $_GET пар «someword» не прошло вместе, и я получаю сообщение «О, шниться!» каждый раз. Какие возможные причины я не могу передать никаким $_GET параметрам через mod_rewrite?

+0

У меня, похоже, нет проблем с кодом ... только мне нужно было изменить '/go.php? Page = $ 1' относительный адрес' go.php? Page = $ 1'. –

+0

hmm. Я только что изменил свое отношение к относительному адресу и все еще не работаю ... получил свой обычный результат: «на shnizzle!» Кто-нибудь знает, есть ли опция глобальной конфигурации для mod_rewrite, о которой я не знаю? (может быть, что-то отключено на моем сервере?) – Cheryl

ответ

8

Вам необходимо добавить флаг QSA (добавить строку запроса) в свое правило перезаписи.

RewriteEngine on 
RewriteRule ^go/([^/\.]+)/?$ /go.php?page=$1 [QSA] 
+0

Я пробовал это и получаю тот же результат: «О, шнизи!» – Cheryl

+0

Следует также упомянуть, что когда я использую [QSA], обычная строка запроса также не передается. Знаете ли вы, есть ли определенные настройки конфигурации mod_rewrite, которые полностью отключают GET вместе? – Cheryl

+1

Это не то, что исправляет QSA - это просто позволяет любой строке запроса на исходном URL-адресе попасть в переписанный URL-адрес –

0

Несколько идей ...

RewriteEngine On 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteRule ^/go/([^/\.]+)/?$ /go.php?page=$1 [QSA] 

Это должно остановить правила mod_rewrite от того срабатывает, если действительная страница, сценарий или каталог запрашивается. Он также добавит любые существующие строки запросов.

В файле go.php, я бы следующее:

<?php 
ini_set('display_errors',1); 
echo '<b>$_GET Variables</b><pre>'; 
var_dump($_GET); 
echo '</pre>'; 
?> 

Таким образом, вместо того чтобы искать для конкретной переменной (по крайней мере, пока он не ведет себя), вы можете увидеть именно то, что GET переменные передаются скрипту.

13

Возможно, у вас есть MultiViews включен. Добавьте это в начало файла .htaccess:

Options -MultiViews 

И эта проблема должна уйти, надеюсь.

Выработать немного о том, что происходит, если это так, то ваш URL /go/someword указывает на несуществующий ресурс, поэтому MultiViews превращает его в /go.php, который не существует. Когда это происходит, бит /somewhere передается PHP как $_SERVER['PATH_INFO'], но go.php не соответствует вашему правилу перезаписи, поэтому переписывание не выполняется для записи этой строки запроса.

+0

Да, это, наверное, так. – ceejayoz

+0

Отлично! Да, это он. Теперь переписывается отлично, и параметры $ _GET проходят. Спасибо! – Cheryl

+0

Хороший материал, рад слышать, что он работает. –

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

  • Нет связанных вопросов^_^