Файл Apache .htaccess использует стандартные конфигурации Apache, такие как Mod Rewrite . Документы Mod Rewrite объясняют, как работают RewriteCond и RewriteRule.
Я разобью ваш вопрос ModRewrite:
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC]
- RewriteCond является условным для определения необходимости перезаписи.
%{HTTP_HOST}
означает, что RewriteCond проверяет имя хоста запроса
^www\.mysite\.com$
- шаблон, проверяет, совпадает ли имя хоста www.mysite.com
[NC]
означает отсутствие регистра, делает сопоставление с шаблоном нечувствительным к регистру
Например, если кто-то запросит http://www.mysite.com/index.html,, RewriteCond
будет проверять хост www.mysite.com на соответствие шаблону ^www\.mysite\.com$
, и, поскольку он совпадает, следующий RewriteRule будет выполнять.
RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L]
- RewriteRule - мощный инструмент для перезаписи запросов
^(.*)$
- шаблон, который будет соответствовать всему. Если шаблон не совпадает, RewriteRule не будет выполняться.
http://mysite.com/$1
- это перезапись, в основном измените запрос с www.
mysite.com на mysite.com.
[R=301,L]
означает, что перезапись должна отправлять перенаправление 301 и быть последним правилом перезаписи, которое будет выполнено.
Продолжая пример http://www.mysite.com/index.html,, который передает RewriteCond, /index.html будет соответствовать шаблону ^(.*)$
, перезапись будет установлена на http://mysite.com/index.html и будет отправлена как 301 перенаправление и больше не будет RewriteRules
.
РЕДАКТИРОВАТЬ: Обдумывание конфигурации
Исходя из моего опыта, вы хотите, чтобы все ваши перенаправления были в верхней части вашего конфига. Особенно в вашем случае, если вы пытаетесь нормализовать свои URL-адреса, запрос будет промыт через серию перенаправлений. Как только это закончится, вы затем переписываете для предоставления правильного содержания. Имея это в виду, вот измененный конфиг двух последних правил:
# show mysite.com/index.php always as mysite.com/
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://mysite.com/ [R=301,QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.*)$ /index.php?a_param=$1 [QSA]
С макушки головы я не могу проверить RewriteCond %{THE_REQUEST}
, но выглядит хорошо. Я подозреваю, что вам нужен флаг [QSA] , представляющий собой строку запроса , добавляемую . Это приведет к перенаправлению http://mysite.com/index.php?user=blah на http://mysite.com/?user=blah.. Вы захотите добавить QSA к другим перенаправлениям, если вам нужно передать строки запроса с перенаправлением.
Последнее правило определяет, следует ли использовать index.php в сравнении со статическим содержимым в каталоге htaccess (каталог, изображения, js и т. Д.). Вы не хотите это как перенаправление, но как переписать. Не используйте [R] или [L], но добавьте [QSA] снова. Для сопоставляемого шаблона должны быть заданы определенные параметры, передаваемые в index.php.
В сочетании с предыдущим правилом http://mysite.com/index.php?user=blah перенаправляется на http://mysite.com/?user=blah, а затем переписывается, так что index.php используется для http://mysite.com/?a_page=&user=blah. Запрос http://mysite.com/a_page?id=7 будет переписано, поэтому index.php используется для http://mysite.com/?a_param=a_page&user=blah