Можете ли вы сделать все подпапки поддоменами, используя правила перезаписи? - PullRequest
2 голосов
/ 21 января 2020

Итак, если у вас есть такая структура:

public_html/folder/example.com/index.php
public_html/folder/example.com/subdomain1/index.php
public_html/folder/example.com/subdomain2/index.php
public_html/folder/example.com/subdomain3/index.php

И вы хотите, чтобы каждая из папок «поддомен» была видна в http://subdomain1.example.com вместо http://example.com/subdomain1/ ...

Можете ли вы добиться этого с помощью комбинации DNS-настройки поддомена с подстановочным символом и только файла .htaccess?

Например, у меня есть подстановочный поддомен с помощью cPanel и у меня в файле .htaccess (root из папки example.com):

<IfModule mod_rewrite.c>
RewriteCond %{HTTP_HOST} ^([^.]+).example.com$ [NC]
RewriteCond %{REQUEST_URI} !%1
RewriteRule ^(.*)$ /%1/$1 [L]
</IfModule>

Но каждый раз, когда я пытаюсь посетить одну из подпапок в поддомене URL, я получаю ошибку 500.

Что-то мне не хватает? Я использовал инструмент тестирования .htaccess, чтобы убедиться, что правила верны. Я знаю, что mod_rewrite включен, и настройки Apache верны. Например, есть ли проблема с индексом. php Часть этого?

Я также могу посетить http://example.com/subdomain1/ и посмотреть сайт. Он не перенаправляет на поддомен, как я думал.

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

Если я пропустил это - идея заключается в том, что всякий раз, когда добавляется подпапка (если не указано исключение c) , он должен быть доступен как адрес субдомена автоматически - без добавления субдомена вручную в cPanel / DNS.

/// РЕДАКТИРОВАТЬ ///

Ниже приведен файл .htaccess в каталоге public_html / root. В каталоге public_html / folder / отсутствует файл .htaccess.

# ----------------------------------------------------------------------
# CORS-enabled images (@crossorigin)
# ----------------------------------------------------------------------
# Send CORS headers if browsers request them; enabled by default for images.
# developer.mozilla.org/en/CORS_Enabled_Image
# blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html
# hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/
# wiki.mozilla.org/Security/Reviews/crossoriginAttribute
<IfModule mod_setenvif.c>
  <IfModule mod_headers.c>
    # mod_headers, y u no match by Content-Type?!
    <FilesMatch "\.(gif|png|jpe?g|svg|svgz|ico|webp)$">
      SetEnvIf Origin ":" IS_CORS
      Header set Access-Control-Allow-Origin "*" env=IS_CORS
    </FilesMatch>
  </IfModule>
</IfModule>
# ----------------------------------------------------------------------
# Webfont access
# ----------------------------------------------------------------------
# Allow access from all domains for webfonts.
# Alternatively you could only whitelist your
# subdomains like "subdomain.example.com".
<IfModule mod_headers.c>
  <FilesMatch "\.(ttf|ttc|otf|eot|woff|woff2|font.css|css|js)$">
    Header set Access-Control-Allow-Origin "*"
  </FilesMatch>
</IfModule>

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

AddType audio/ogg ogg ogv
AddType video/ogg ogg ogv

1 Ответ

1 голос
/ 22 января 2020
RewriteCond %{HTTP_HOST} ^([^.]+).example.com$ [NC]
RewriteCond %{REQUEST_URI} !%1
RewriteRule ^(.*)$ /%1/$1 [L]

Это может вызвать перезапись l oop (ответ HTTP 500). Я думаю, это потому, что серверная переменная REQUEST_URI не обновляется.

Вы хотите, чтобы этот блок кода выполнялся только при первоначальном запросе, поэтому вы можете решить эту проблему, проверив переменную окружения REDIRECT_STATUS, которая не установлено (ie. пусто) для первоначального запроса и установлено в «200» (как в состоянии «200 ОК») после первого успешного перезаписи.

Например, попробуйте следующее:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC]
RewriteRule (.*) /%1/$1 [L]

Нет необходимости в оболочке <IfModule>, поскольку ваш сайт не будет работать без mod_rewrite. (.*) совпадает с ^(.*)$, поскольку по умолчанию регулярное выражение является жадным.


В стороне:

Обратите внимание, что директивы mod_rewrite в этом домене Addon Файл .htaccess переопределит директивы mod_rewrite в родительском .htaccess (ie. public_html/.htaccess), поэтому нет HTTP-HTTPS - если только вы явно не включили наследование mod_rewrite в конфигурации сервера.

Однако директивы Header в родительском .htaccess все еще должны обрабатываться.

...