Я написал этот код для 301 redirect
RewriteCond %{THE_REQUEST} ^.*\/index\.php\ HTTP/ RewriteRule ^(.*)index\.php$ /$1 [R=301,L]
Он работает хорошо, если я посещаю свой сайт как http://mysite.com/index.php
, он перенаправляет меня на http://mysite.com
Но на моем localhost
localhost/mysite/index.php
если я пытаюсь посетить index.php
как localhost/mysite/index.php
он перенаправляет меня на localhost
.
Как я могу решить эту проблему? Правильно ли указан код, написанный выше?
Похоже, у вас есть файл htaccess в корне вашего документа на вашем сервере и в каталоге mysite
на localhost. Поскольку местоположение файла htaccess довольно важно для того, как он перенаправляет URI, вам нужно сделать его равнодушным к местоположению файла. Вы можете сделать это, извлекая информацию о пути из своего условия, а не URI, который передан в правило, чтобы соответствовать:
RewriteCond %{THE_REQUEST} ^[AZ]{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
.
попробуй это
RewriteRule ^(.*)index\.php$ /$1 [R=301,NC]
Если ваш сайт не находится в корневом каталоге сервера (который не находится на вашем локальном RewriteBase
), вам нужно будет добавить директиву RewriteBase
: https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
Вам нужно добавить строку:
RewriteBase /mysite/
над текущими строками в htaccess на вашем локальном хосте
Хотя директива RewriteBase
означает это использование, вы можете протестировать localhost и переписать root в свой подкаталог только в том случае, если test == true. например:
RewriteCond %{HTTP_HOST} ^localhost$ RewriteCond %{REQUEST_URI} !^/subdirectory/ RewriteRule (.*) /subdirectory/$1 [L]
Примечание. Я не использовал это в течение некоторого времени и не могу гарантировать, что он будет работать из коробки; может потребоваться некоторое редактирование.