правило .htaccess, пропускающее вложенную папку в перенаправлении

#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
)