Где взять турникеты htaccess - PullRequest
0 голосов
/ 20 марта 2012

Везде, где я смотрю онлайн, все учебники htaccess довольно просты. Никто из них не объясняет, что

RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC]
RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L]

[NC] и [R=301,L] означают (я могу представить 301 redir tho)

Кроме того, откуда появился токен %{HTTP_HOST}? Какие еще есть? Когда был захвачен $1? ...

Существуют ли учебники, которые объясняют все это?

РЕДАКТИРОВАТЬ: Вот мой htaccess файл для mguymon:

Options -Indexes
ErrorDocument 404 /404.php
CheckSpelling on

RewriteEngine On
RewriteBase /  
###### Check for alias module to be installed ######

###### Domain without www ######
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC]
RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L]

###### End www rewrite section ######

# Remove multiple slashes anywhere in URL
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

# Remove multiple slashes after domain
RewriteCond %{HTTP_HOST} !=""
RewriteCond %{THE_REQUEST} ^[A-Z]+\s//+(.*)\sHTTP/[0-9.]+$
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?$1 [L]

# 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,L]

Это изменит www.mysite.com/index.php/////index.php на mysite.com, то есть три правила, каждое с переключателем [L] в них

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Файл 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

1 голос
/ 20 марта 2012

Ознакомьтесь с документацией Apache . Это объясняет, что означают все опции в [] скобках.

  • [NC] без учета регистра (или без учета регистра)
  • [R=301] - перенаправление 301 (постоянное)
  • [L] означает последнее правило или прекратить переписывание

%{HTTP_HOST} - это переменная сервера или среды , представляющая базовый URL-адрес хоста, например www.example.com.

Если вы понимаете регулярные выражения, вы также должны понимать, что группировка (.*) соответствует всем символам между началом ^ и концом $ пути (всего пути), который вы затем можете использовать во втором часть как $1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...