Перенаправить в htaccess в папку и https - PullRequest
1 голос
/ 27 января 2020

Используя htaccess, я хочу принудительно установить http на https и одновременно перенаправить на www. и в папку «publi c», где находятся файлы моего приложения. В результате http://example.com следует перенаправить на https://www.example.com/public/

Для перенаправления на https и www I управлять с помощью:

RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] 
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

Для перенаправления на 'publi c 'папка, которой я управляю, используя:

ReWriteCond %{REQUEST_URI} !^public/
ReWriteRule ^(.*)$ public/$1 [L]

Теперь мне нужно объединить их, но мои многочисленные попытки не привели к рабочему перенаправлению, и мне понадобится совет по этому поводу.

РЕДАКТИРОВАТЬ: В папке publi c находится другой файл htaccess:

 SetEnv APPLICATION_ENV "production"
 RewriteEngine On
 RewriteCond %{REQUEST_FILENAME} -s [OR]
 RewriteCond %{REQUEST_FILENAME} -l [OR]
 RewriteCond %{REQUEST_FILENAME} -d
 RewriteRule ^.*$ - [NC,L]
 RewriteRule ^.*$ /index.php [NC,L]

<< </p>

1 Ответ

1 голос
/ 28 января 2020
ReWriteCond %{REQUEST_URI} !^public/
ReWriteRule ^(.*)$ public/$1 [L]

Серверная переменная REQUEST_URI начинается с sla sh, поэтому указанное выше условие никогда не будет совпадать. Например:

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

Однако, если у вас есть другой файл .htaccess в подкаталоге /public, я бы написал этот блок следующим образом:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) public/$1 [L]

Это имеет добавлено преимущество, заключающееся в том, что в начале URL-адреса можно указать сегмент пути public (если вы sh). например. URL /public/foo будет внутренне переписан на /public/public/foo без создания перезаписи l oop.

RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] 
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

В первом условии отсутствует флаг OR. Например:

RewriteCond %{HTTPS} off [OR]
:

Без этого он не сможет перенаправить http://www.example.com/ на HTTPS.

Просто чтобы уточнить, каноническое перенаправление должно go перед внутренней перезаписью на * Каталог 1028 *.


ОБНОВЛЕНИЕ:

РЕДАКТИРОВАТЬ: В папке publi c находится другой файл htaccess:

SetEnv APPLICATION_ENV "production"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]

Неверная строка *1041* в последней директиве RewriteRule. Вам необходимо удалить префикс sla sh из /index.php. Стоит просто прочитать index.php. В противном случае он перезапишет запрос обратно в документ root (путь к файловой системе) и приведет либо к бесконечному l oop, либо к 404 (в зависимости от родительских директив). Изменив его на index.php (без sla * sh), теперь оно относительно каталога /public (каталога, содержащего файл .htaccess) вместо документа root.

. Вы также можете упростить шаблон RewriteRule , и флаг NC здесь не требуется. Итак, в итоге, файл /public/.htaccess должен выглядеть так:

SetEnv APPLICATION_ENV "production"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^ index.php [L]
...