Поведение постоянных ссылок в Wordpress - PullRequest
0 голосов
/ 05 сентября 2018

Я использую экземпляр LAMP со средним значением AWS. У меня есть три бета-тестирования WordPress сайтов, все они работают и рендерит страницы, ни один не завершен на 100% Версии программного обеспечения сервера:

php 7.0.3

httpd apache / 2.4.33

Wordpress 4.9.8

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

Проблема, с которой я сталкиваюсь, - это когда я изменяю свои настройки постоянной ссылки на% postname%, сайт не может найти страницы. На этом этапе я исключительно ссылаюсь только на страницы, а не на посты. Я не проводил никаких тестов с сообщениями.

Я подтвердил, что mod_rewrite загружен с использованием

sudo apachectl -t -D DUMP_MODULES
and
<?php phpinfo(); ?>

Первая команда перечисляет rewrite_module (общий доступ) как присутствующий. Скрипт php показывает mod_rewrite как часть загруженных модулей.

Хороший ресурс, за которым я следовал, был https://serverfault.com/questions/445599/enabling-mod-rewrite-on-amazon-linux. Было множество других, но это, казалось, охватило все существенные моменты, которые поднял другой поиск.

Исходя из вышеизложенного, я воспользовался советом по тестированию перенаправления, и он сработал, перенаправив один из моих доменов на wordpress.org. (чтобы пройти этот тест я отредактировал /etc/httpd/conf/httpd.conf)

Пожалуйста, попробуйте это: в конфигурации сервера - не .htaccess добавьте строки RewriteEngine On и RewriteRule ^ (. *) $ http://www.wordpress.org/ [R], чтобы подтвердить, работает ли перезапись в все. Он должен передавать весь трафик на сайт Wordpress

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

Я просто добавил эхо get_permalink (290); на мой простой код плагина. И это правильно повторило

https://www.mydomainname.com/correct-slug-for-page-290

Если я скопирую и вставлю URL-адрес над ним, произойдет сбой.

Примечание. Когда я изменяю свои настройки постоянной ссылки, файл .htaccess автоматически изменяется / обновляется.

Если я установил обычные настройки постоянной ссылки WordPress, все будет работать.

Если я установлю свои постоянные настройки WordPress на custom и использую index.php /% postname% / все ссылки разрешаются. (Как с .htaccess, так и без него)

Если я установлю мои постоянные ссылки только на% postname%, все станет ошибкой 404. При установке% postname% wordpress автоматически создает следующий файл

-rw-r--r-- 1 apache www 235 Sep  4 21:47 .htaccess 

#BEGIN WordPress
<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

Отрывки из моего httpd.conf с большинством комментариев отредактированы. Я планирую вернуться и ужесточить некоторые настройки, как только смогу заставить работать эту базовую функциональность.

Ценю любые идеи, советы или предложения. Спасибо всем.

#
ServerRoot "/etc/httpd"


Listen 80

Include conf.modules.d/*.conf


User apache
Group apache

ServerAdmin root@localhost

<Directory />
    AllowOverride All
    Require all granted
</Directory>

DocumentRoot "/var/www/html"

#
# Relax access to content within /var/www.
#
<Directory "/var/www">
    AllowOverride All
    # Allow open access:
    Require all granted
</Directory>

# Further relax access to the default document root:
<Directory "/var/www/html">
    Options Indexes FollowSymLinks

    AllowOverride All

    Require all granted
</Directory>

#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

#
# The following lines prevent .htaccess and .htpasswd files from being 
# viewed by Web clients. 
#
<Files ".ht*">
    Require all denied
</Files>


<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

</IfModule>

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

<IfModule mime_module>
    TypesConfig /etc/mime.types

    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz

    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>


EnableSendfile on

# Supplemental configuration
#
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf

<VirtualHost *:80>
    ServerAdmin webmaster@beta-test-one.com
    DocumentRoot /var/www/html/beta-test-one.com
    ServerName beta-test-one.com
    ServerAlias www.beta-test-one.com
    RewriteEngine On
    <IF "req('Host') != 'www.beta-test-one.com'">
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://www.%{HTTP:Host}%{REQUEST_URI} [L,R=301]
    </IF>
    <ELSE>
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]
    </ELSE>
    ErrorLog logs/beta-test-one.com-error_log
    CustomLog logs/beta-test-one.com-access_log common
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin webmaster@beta-test-two.com
    DocumentRoot /var/www/html/beta-test-two.com
    <Directory "/var/www/html/beta-test-two.com">
    AllowOverride All
    </Directory>
    ServerName beta-test-two.com
    ServerAlias www.beta-test-two.com
    RewriteEngine On
    <IF "req('Host') != 'www.beta-test-two.com'">
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://www.%{HTTP:Host}%{REQUEST_URI} [L,R=301]
    </IF>
    <ELSE>
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]
    </ELSE>
    ErrorLog logs/beta-test-two.com-error_log
    CustomLog logs/beta-test-two.com-access_log common
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin webmaster@beta-test-three.com.au
    DocumentRoot /var/www/html/beta-test-three.com.au
    ServerName beta-test-three.com.au
    ServerAlias www.beta-test-three.com.au
    RewriteEngine On
    <IF "req('Host') != 'www.beta-test-three.com.au'">
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://www.%{HTTP:Host}%{REQUEST_URI} [L,R=301]
    </IF>
    <ELSE>
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]
    </ELSE>
    ErrorLog logs/beta-test-three.com-error_log
    CustomLog logs/beta-test-three.com-access_log common
</VirtualHost>

1 Ответ

0 голосов
/ 12 сентября 2018

Теперь проблема решена.

Я начал просматривать настройки mod_rewrite. Я понял, что проверил из файла httpd.conf, но не проверял перенаправление на уровне .htaccess, следуя некоторым советам из следующей статьи

https://docs.bolt.cm/3.4/howto/making-sure-htaccess-works

В итоге файл .htaccess был обойден.

Конечным виновником были явные перенаправления на https в файле httpd.conf

 RewriteEngine On <IF "req('Host') != 'www.beta-test-three.com.au'">
 RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule .*
 https://www.%{HTTP:Host}%{REQUEST_URI} [L,R=301] </IF> <ELSE>
 RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule .*
 https://%{HTTP:Host}%{REQUEST_URI} [L,R=301] </ELSE>

Я удалил эти строки и протестировал снова ... Стандартные постоянные ссылки WordPress все решают. Первоначально я добавил эти строки, потому что, когда я набирал domain-name.com (без префикса https), я получал сообщения от браузера о том, что сайт не защищен.

Однако, обновив файл wp-config следующим образом (см. Ниже), мне не нужно перенаправление https в файле httpd.conf, и это позволило работать правилам перезаписи .htaccess.

define('WP_HOME','https://www.domain-name.com');
define('WP_SITEURL','https://www.domain-name.com');

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';
...