2013-09-11 2 views
5

Я написал этот код для 301 redirectудалить index.php перезаписи URL .htaccess

RewriteCond %{THE_REQUEST} ^.*\/index\.php\ HTTP/ 
RewriteRule ^(.*)index\.php$ /$1 [R=301,L] 

Он хорошо функционирующего в случае, если я посетить мой сайт, как http://mysite.com/index.php, он перенаправляет меня http://mysite.com

Но на моем localhost, если я попытаюсь посетить index.php как localhost/mysite/index.php, он перенаправляет меня на localhost.

Как я могу решить эту проблему? Правильно ли указан код, написанный выше?

+0

На вашем локальном хосте вам нужно добавить 'RewriteBase/mysite /' над этими строками, так как сайт не находится в корне сервера – keithhatfield

ответ

6

Похоже, что у вас есть файл htaccess в корне вашего документа на вашем сервере и в каталоге mysite на localhost. Поскольку местоположение файла htaccess довольно важно для того, как он перенаправляет URI, вам нужно сделать его равнодушным к местоположению файла. Вы можете сделать это путем извлечения информации пути от вашего состояния вместо URI, который передается в правило для сопоставления:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)index\.php($|\ |\?) 
RewriteRule^/%1 [R=301,L] 

Переменная %{THE_REQUEST} является первой линией фактического запроса HTTP, который выглядит что-то вроде:

GET /path/index.php HTTP/1.1 

узор первым соответствует любому числу возможных СПОСОБОВ (GET, POST, HEAD, и т.д.), то он создает группировку пути URI, что это перед темindex.php, затем заканчивается совпадение, так как нам все равно, что после index.php.

+0

как этот код работает 'RewriteCond% {THE_REQUEST}^[AZ] {3, 9} \ /(.*) index \ .php ($ | \) '? Немного пояснения к элементам –

+0

@MohammadFaisal см. В редакции –

+0

все еще не работает на' localhost'. Я был перенаправлен на 'localhost' вместо' localhost/mysite' –

4

попробовать этот

RewriteRule ^(.*)index\.php$ /$1 [R=301,NC] 
+0

В чем разница? –

+0

[r = 301, nc] [nc] указывает, что хост http нечувствителен к регистру. –

+0

и что означает 'L'? –

2

Если ваш сайт не в корневом каталоге сервера (который он не находится на вашем локальном хосте), вам нужно будет добавить RewriteBase директиву: https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase

Вам нужно добавьте строку:

RewriteBase /mysite/ 

выше линий тока в HTAccess на вашем локальном хосте

+0

может быть любое решение, которое будет работать с обеих сторон (то есть 'localhost' и' server') –

+0

его все еще не работает :( –

0

В то время как директива RewriteBase предназначена для этого использования, вы можете протестировать локальный хост и переписать root в свой подкаталог только в том случае, если test == true. например:

RewriteCond %{HTTP_HOST} ^localhost$ 
RewriteCond %{REQUEST_URI} !^/subdirectory/ 
RewriteRule (.*) /subdirectory/$1 [L] 

Примечание: Я не использовал это в течение некоторого времени и не могу гарантировать, что он будет работать из коробки; может потребоваться некоторое редактирование.

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