Назад | Перейти на главную страницу

Нежелательные 301 редиректы с Apache2 и Wordpress

У меня следующая конфигурация: мой apache2.conf файл:

DocumentRoot /var/www/html
<Directory / >
        # Options FollowSymLinks
        AllowOverride None
        Require all granted
        RewriteEngine On
        RewriteBase /
        RewriteRule ^index\.php$ - [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /index.php [L]
</Directory>

Я считаю, что это в значительной степени шаблон для сайтов wordpress. Если я использую завиток просить /index.php он работает нормально, но если я прошу рут http://localhost/ он ничего не возвращает в теле, а заголовок выглядит так:

> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Date: Sun, 30 Jun 2019 18:31:38 GMT
< Server: Apache/2.4.18 (Ubuntu)
< Location: http://ken.net/
< Content-Length: 0
< Content-Type: text/html; charset=UTF-8
< 
* Connection #0 to host localhost left intact

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


Добавление полного apache2.conf:

Mutex file:${APACHE_LOCK_DIR} default
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100


KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

HostnameLookups Off

ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn

IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

Include ports.conf

DocumentRoot /var/www/html
<Directory / >
        # Options FollowSymLinks
        AllowOverride None
        Require all granted
        RewriteEngine On
        RewriteBase /
        RewriteRule ^index\.php$ - [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /index.php [L]
</Directory>

AccessFileName .htaccess
<FilesMatch "^\.ht">
        Require all denied
</FilesMatch>

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf

Каталог mods-enabled выглядит так:

access_compat.load  authn_file.load  autoindex.load  env.load          mpm_prefork.load  rewrite.load
alias.conf          authz_core.load  deflate.conf    filter.load       negotiation.conf  setenvif.conf
alias.load          authz_host.load  deflate.load    mime.conf         negotiation.load  setenvif.load
auth_basic.load     authz_user.load  dir.conf        mime.load         php7.0.conf       status.conf
authn_core.load     autoindex.conf   dir.load        mpm_prefork.conf  php7.0.load       status.load

Теперь, когда я знаю ./sites-enabled/*.conf заявление в основной конфигурации я удалил <DIRECTORY></DIRECTORY> инструкции из основной конфигурации и в конфигурации сайта по умолчанию (также известной как /etc/apache2/sites-enabled/000-default.conf) Я изменил на:

<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@site.com
        DocumentRoot /var/www/html

        <Directory / >
                # Options FollowSymLinks
                AllowOverride None
                Require all granted
                RewriteEngine On
                RewriteBase /
                RewriteRule ^index\.php$ - [L]
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule . /index.php [L]
        </Directory>>

        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

Wordpress и тому подобное любят наивно предполагать, что на него указывает только один домен. (И также, что протокол тот же самый для вашего обратного прокси-сервера и бэкэнда. У вас была бы такая же проблема, если бы ваш apache использовал https, а wordpress был обратным прокси-сервером для какой-то другой вещи (другой хост, тот же хост, другая служба)).

Поэтому, если вы не можете настроить WordPress так, чтобы он не перенаправлял вас (возможно, плагин или исправление php), вам просто нужно убедиться, что URL-адрес, который вы установили в wordpress, совпадает с тем, который пользователь использует для перехода на ваш сайт.

Если вы хотите сделать что-то другое в тестовой среде, я рекомендую использовать исходные рабочие URL-адреса (в вашем случае http://ken.netне http: // localhost), но изменив их IP-адреса на вашу тестовую среду в вашем файле hosts (например, 127.0.0.1 ken.net) на клиенте. Тогда тестирование станет проще без перенастройки URL-адресов и различного поведения в зависимости от конфигурации.