#regex #.htaccess
#регулярное выражение #.htaccess
Вопрос:
Вот мое правило перезаписи:
RewriteEngine on
RewriteRule ^dev/([^/] )/ dev/index.php?test=$1 [NC]
Однако вместо изменения URL-адреса с www.test.com/dev/asdf
на www.test.com/dev/index.php?test=asdf
, вместо этого происходит то, что мы получаем www.test.com/index.php?test=asdf
. Таким образом, в основном dev/
часть в правиле перезаписи просто пропускается.
Предполагаемый эффект должен dev/variable/
быть проанализирован как переменная get, поэтому он будет изменен на dev/index.php?test=variable
.
Ответ №1:
Это может быть несколько причин: .htaccess
находится не в той папке, неверно настроена база перезаписи в другом месте или URL-адрес переписывается другим правилом.
Обязательно поместите .htaccess
в свою DOCUMENT_ROOT
папку (ту, что выше dev
).
Затем попробуйте это:
RewriteEngine on
RewriteBase /
RewriteRule ^dev/([^/] )/ dev/index.php?test=$1 [NC,L]
Ответ №2:
Попробуйте mod_rewrite
вместо этого этот набор правил:
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/(dev/index.php)$ [NC]
RewriteRule ^dev/?([^/]*)$ /dev/index.php?test=$1 [R,L,NC]
Вторая строка, которая имеет RewriteCond
, предназначена для обеспечения того, чтобы у вас не было бесконечного цикла dev/[something]
перехода dev/index.php
, что приведет к внутренней ошибке сервера. R
Флаг устанавливает реальное перенаправление /dev/index.php?test=
, а не просто передает параметры за кулисами.
И одним из преимуществ R
флага является то, что вы отлаживаете этот материал, используя curl -I
из командной строки, например, так, чтобы показать вам фактические возвращаемые заголовки. Я использую localhost:8888
в своем локальном MAMP, FWIW:
curl -I localhost:8888/dev/asdf
Теперь результирующие заголовки выглядят следующим образом:
HTTP/1.1 302 Found
Date: Sun, 29 Jun 2014 04:15:31 GMT
Server: Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/0.9.8y DAV/2 PHP/5.4.10
Location: http://localhost:8888/dev/index.php?test=asdf
Content-Type: text/html; charset=iso-8859-1
Это HTTP/1.1 302 Found
означает, что 302
произойдет временное перенаправление. И Location
заголовок показывает правильное конечное назначение http://localhost:8888/dev/index.php?test=asdf
.
Затем в моей тестовой настройке я поместил dev/index.php
файл, содержащий этот простой PHP-код:
<?php
echo '<pre>';
print_r($_GET);
echo '</pre>';
?>
Таким образом, вызов localhost:8888/dev/asdf
создает конечный URL http://localhost:8888/dev/index.php?test=asdf
-адрес, и вывод этого PHP-скрипта показывает, что asdf
он правильно передается по желанию:
Array
(
[test] => asdf
)