файл .htaccess для выполнения определенных перезаписей на разных uri

В моем файле .htaccess есть следующее:

<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On

    # Block hidden directories
    RewriteRule "(^|/)\." - [F]

    # Prevent /health_check.php from using https
    RewriteCond %{REQUEST_URI} !(health_check\.php)$

    # Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
    RewriteCond %{REQUEST_URI} !^/(sns)/

    # Reroute http to https
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    # Prevent rewriting of domain for codeigniter
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

</IfModule>

Кажется, все работает нормально, за исключением части / sns . Я не могу заставить это прекратить перенаправление на https.

Я бы хотел http://sub.example.com/sns и http://sub.example.com/health_check .php , чтобы не перенаправлять на https.

1
задан 22 February 2018 в 15:48
1 ответ
 # Запретить / sns использовать https, но для этого НЕОБХОДИМО перезапись codeigniter (см. Ниже)
RewriteCond% {REQUEST_URI}! ^ / (Sns) /
 

Если URL-адрес запроса не заканчивается косой чертой (как указано), то указанное выше правило (которое включает конечную косую черту в CondPattern ) всегда будет успешным (это инвертировано. условие), поэтому перенаправление на HTTPS будет происходить всегда.

В идеале, вы должны канонизировать завершающую косую черту раньше в запросе. Включите либо завершающую косую черту, либо нет (в противном случае это по существу дублированный контент и потенциально может вызвать проблемы с другими скриптами, анализирующими URL-адрес).

Однако для обработки двух URL-адресов / sns и / sns / , то вам нужно сделать завершающую косую черту необязательной и включить привязку конца строки ( ^ ). Например:

RewriteCond %{REQUEST_URI} !^/sns/?$

Обратите внимание, что это соответствует только двум указанным URL. Он не будет соответствовать URL-адресу формы / sns / .

Я удалил круглые скобки вокруг сегмента пути (вы также должны удалить другие круглые скобки в вашем регулярном выражении). Это создает захваченную группу и является излишним в опубликованных вами директивах.

ОБНОВЛЕНИЕ: Вам также потребуется дополнительная проверка, чтобы убедиться, что перезаписанный URL (т.е. /index.php/sns ) не перенаправляется. Вы можете сделать это более общим способом, применив перенаправление HTTPS только к начальному запросу, а не к перезаписанному запросу, включив дополнительное условие:

# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$

Переменная среды REDIRECT_STATUS установлена ​​на «200» после первой успешной перезаписи (т. е. маршрутизации CodeIgniter). Он не установлен в первоначальном запросе (например, ^ $ - пустая строка).

Если это все еще приводит к перенаправлению, возможно, что CodeIgniter сам инициирует перенаправление (после . htaccess был обработан).

 RewriteRule ^ (. *) $ ./index.php/$1 [L, QSA]
 

В сторону: И, как отмечалось в моем комментарии, вам следует удалить префикс ./ в замене RewriteRule . См. конец моего ответа на этот вопрос StackOverflow для объяснения.

Резюме

Options +FollowSymlinks
RewriteEngine On

# Block hidden directories
RewriteRule ^\. - [F]

# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$

# Prevent /health_check.php from using https
RewriteCond %{REQUEST_URI} !health_check\.php$

# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/sns/?$

# Reroute http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Prevent rewriting of domain for codeigniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

Перенаправление HTTP на HTTPS в конечном итоге должно быть 301 (постоянным) перенаправлением, но только как только вы подтвердите, что он работает нормально. Флаг R по умолчанию установлен на 302 (временное) перенаправление.

(Вам также не нужна оболочка , если ваш сайт не предназначен для работы без mod_rewrite?)

0
ответ дан 4 December 2019 в 04:13

Теги

Похожие вопросы