Перенаправить http, не- www to https, с подпапкой www for - PullRequest
1 голос
/ 25 марта 2020

Я перепробовал почти все решения, которые я мог найти в stackoverflow и других веб-сайтах, но я не могу заставить его работать, поэтому я попытался представить свой вопрос.

Моя папка будет:

  • public_html/wordpress root folder (A)
  • public_html/wordpress root folder/traveltour (B)

Я установил Let's Encrypt для (A), и он работает для (B) без установка Let's Encrypt снова в (B). Но я не могу перенаправить (B) на HTTPS с www. Часть кода, который я пробовал в моем .htaccess файле:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
</IfModule>

#force https 
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

И еще, когда я нашел его с помощью поиска Google, но ничего не работает. Я надеюсь получить несколько советов, чтобы решить эту проблему с помощью .htaccess без использования плагина, поэтому я разместил свой вопрос здесь, а не на WordPress StackExchange.


Редактировать:

Если я попытался загрузить : (B) с http & non www, он остается на http с www, или, если я попытался загрузить: (B) с http & с www, он остается тем же без https. Часть кода перенаправила (B) на (A) и сделала мою ссылку 404 не найденной, поэтому я удалил ее.


Редактировать 2:

У меня есть индивидуальный .htaccess файл и структура директора, как показано ниже:

  • /public_html/.htaccess (A)
  • /public_html/B/.htaccess (B)

/.htaccess (A ):

# BEGIN WordPress
# The directives (lines) between `BEGIN WordPress` and `END WordPress` are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

/B/.htaccess (B):

# BEGIN MainWP
# The directives (lines) between `BEGIN MainWP` and `END MainWP` are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.

# END MainWP



# BEGIN WordPress
# The directives (lines) between `BEGIN WordPress` and `END WordPress` are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /traveltour/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /traveltour/index.php [L]
</IfModule>
# END WordPress

# BEGIN SSL

# END SSL

1 Ответ

1 голос
/ 27 марта 2020
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]

Это не будет работать, если используется в файле .htaccess в подкаталоге (сайт B), например. /traveltour/.htaccess, так как это приведет к тому, что пользователь будет перенаправлен обратно на сайт A в root. Захваченная обратная ссылка $1 не будет содержать подкаталог. Вместо этого вам нужно будет использовать серверную переменную REQUEST_URI, чтобы использовать полный URL-путь (как вы делаете в третьем блоке кода).

Также обратите внимание, что SERVER_NAME может не содержать желаемого значения - в зависимости от вашей системы. По умолчанию SERVER_NAME совпадает с HTTP_HOST (значение заголовка HTTP-запроса Host, ie. Запрашиваемое имя хоста), однако, если в конфигурации сервера установлено UseCanonicalName On, то вместо этого это будет быть значением имени хоста, установленным в директиве ServerName. Это может быть не www or www domain или что-то еще полностью (если у вас несколько доменов). Поэтому, не зная вашей системы, использование SERVER_NAME здесь не обязательно является надежным / обобщенным решением.

Например, в /B/.htaccess, до фронт-контроллера WordPress:

# Redirect HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# BEGIN WordPress
:

Что в основном совпадает с вашим 3-м кодовым блоком. Оболочка <IfModule> не требуется и должна быть опущена. Вам также не нужно повторять директиву RewriteEngine On (что происходит позже в файле - внутри блока кода WordPress).

В файле root /.htaccess (сайт A), вы можете использовать те же директивы, что и выше, ИЛИ версию с перехватом обратной ссылки - это не имеет значения в этом контексте.

Обратите внимание, однако, что это только перенаправление HTTP на HTTPS, оно не канонизировать www subdomain. (Это обычно обрабатывается самим WordPress путем установки правильных значений WP_SITEURL и WP_HOME в wp-config.php.) Для обработки этого в .htaccess вы можете изменить приведенное выше правило следующим образом:

# Redirect HTTP to HTTPS and non-www to www
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]

Это предполагает, что у вас нет других поддоменов, которые должны быть доступны, поскольку все перенаправлено на www.

Если вы хотите «обобщенное» решение, которое явно не упоминает имя домена (хотя это не обязательно лучший вариант - зависит от вашей системы), тогда вы можете сделать что-то вроде этого:

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

Обратная ссылка %1 соответствует запрошенному имени хоста l ess префикс www. (если есть).

Опять же, это будет работать как в файлах /.htaccess, так и /B/.htaccess.

Сначала необходимо протестировать с 302 (временными) перенаправлениями чтобы избежать потенциальных проблем с кэшированием. И перед тестированием вам необходимо будет очистить кэш браузера. 301s постоянно кэшируется браузером, поэтому тестирование может быть проблематичным c.

...