Здесь есть еще несколько вопросов по этой же теме, которые я прочитал, но мой немного отличается. Я пытаюсь сделать очень простой 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
«somord» НЕ передается, и я получаю сообщение «oh shnizzle!». каждый раз. Каковы возможные причины, по которым я не могу передать какие-либо параметры $_GET
через mod_rewrite?
Вероятно, вы включили MultiViews
. Добавьте это в начало файла .htaccess
:
Options -MultiViews
И, надеюсь, проблема должна исчезнуть.
Чтобы немного рассказать о том, что происходит, если это так, ваш URL /go/someword
указывает на несуществующий ресурс, поэтому MultiViews
преобразует его в /go.php
, который существует. Когда это происходит, бит /somewhere
go.php
передается PHP как $_SERVER['PATH_INFO']
, но go.php
не соответствует вашему правилу перезаписи, поэтому переписывание не выполняется для записи этой строки запроса.
Вам нужно добавить флаг QSA (добавить строку запроса) в правиле rewrite.
RewriteEngine on RewriteRule ^go/([^/\.]+)/?$ /go.php?page=$1 [QSA]
Несколько идей …
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 передаются скрипту.