htaccess возвращает 404 в Wordpress в подкаталоге (рабочий стол в порядке, мобильный 404) - PullRequest
0 голосов
/ 03 марта 2020

У меня есть сайт, созданный в WordPress, установленный в подкаталоге (назовем его «wp_dir»). Я следовал инструкциям в https://wordpress.org/support/article/giving-wordpress-its-own-directory/, а именно:

  • изменить root htaccess файл
  • изменить root индекс. php file
  • изменить файл wp_dir htaccess

Хорошо работает, на рабочем столе, но не на мобильном. В десктопе сайт отображается хорошо: когда вы набираете «example.com», он хорошо отображает сайт WordPress, из WordPress, установленного в папке wp_dir, с SSL и всем остальным. Все ссылки меню работают хорошо.

Вместо этого в мобильном телефоне при вводе «example.com» URL-адрес меняется на «example.com/wp_dir» с SSL, и ссылки меню отображаются, но отображаются Ошибка 404 Ссылки работают.

Я считаю, что проблема связана с SSL. Я также попытался удалить директивы [L], чтобы инструкции продолжали выполняться, но безрезультатно. Что-то не работает нормально, или в неправильном порядке, но я не могу найти что.

Файл htaccess довольно сильно перепутан со многими различными инструкциями (SSL, не www redirection, разрешения для других подкаталогов для приложений управления, блочных эксплойтов и т. д. c). Сайт был ранее построен в Joomla. Очевидно, что я сделал что-то не так, но я не могу понять, что это такое.

Как это может хорошо работать, когда вы получаете доступ к нему на настольном компьютере, а не на мобильном телефоне?

Вот текущий htaccess в каталоге root (без беспорядка):

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

RewriteBase /
RewriteEngine On

# non-www 
RewriteBase /
RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
RewriteCond %{HTTPS} OFF
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
RewriteCond %{HTTPS} ON
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/wp_dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /wp_dir/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ wp_dir/index.php [L] 
</IfModule>

А вот htaccess в подкаталоге Wordpress ("wp_dir"):

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

# 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

В случае, если полезно просмотреть полный файл htacess (с беспорядком), вот он:

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

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

RewriteBase /
RewriteEngine On

## Begin - Rewrite rules to block out some common exploits.
# If you experience problems on your site block out the operations listed below
# This attempts to block the most common type of exploit `attempts` to Joomla!
#
# Block out any script trying to base64_encode data within the URL.
RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
# Block out any script that includes a <script> tag in URL.
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL.
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL.
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
# Return 403 Forbidden header and show the content of the root homepage
RewriteRule .* index.php [F]
#
## End - Rewrite rules to block out some common exploits.

## Allow access to 'gui' zone
RewriteRule ^(gui)($|/) - [L]
RewriteRule ^(gui/services)($|/) - [L]
RewriteRule ^(gui/services/api.php)($|/) - [L]
RewriteRule ^(gui/services/.*)($|/) - [L]
RewriteRule ^(gui/services/customers)($|/) - [L]
RewriteRule ^(gui/.*)($|/) - [L]
RewriteCond %{REQUEST_URI} ^/(gui|gui/.*)$
RewriteRule ^.*$ - [L]
RewriteCond %{REQUEST_URI} ^/(gui/services|gui/services/.*)$
RewriteRule ^.*$ - [L]
RewriteCond %{REQUEST_URI} ^/(gui/index.php|gui/index.php*/.*)$
RewriteRule ^.*$ - [L]
RewriteCond %{REQUEST_URI} ^/(gui/services/customers|gui/services/customers/.*)$
RewriteRule ^.*$ - [L]
RewriteCond %{REQUEST_URI} ^/(gui/services/customers)$
RewriteRule ^.*$ - [L]
RewriteCond %{REQUEST_URI} ^/(gui/services)$
RewriteRule ^.*$ - [L]
RewriteCond %{REQUEST_URI} ^/(gui/services/.*)$
RewriteRule ^.*$ - [L]
## End access to 'gui' zone

## Allow access to dir_zone2
RewriteCond %{REQUEST_URI} ^/(dir_zone2/|dir_zone2/.*)$
RewriteRule ^.*$ - [L]


# RewriteCond %{REQUEST_URI} !^/(gui|gui/.*)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

## Joomla SEF Section
# If the requested path and file is not /index.php and the request
# has not already been internally rewritten to the index.php script
RewriteCond %{REQUEST_URI} !^/index\.php
# and the request is for something within the component folder,
# or for the site root, or for an extensionless URL, or the
# requested URL ends with one of the listed extensions
RewriteCond %{REQUEST_URI} /component/|(/[^.]*|\.(php|html?|feed|pdf|vcf|raw))$ [NC]
# and the requested path and file doesn't directly match a physical file
RewriteCond %{REQUEST_FILENAME} !-f
# and the requested path and file doesn't directly match a physical folder
RewriteCond %{REQUEST_FILENAME} !-d
# internally rewrite the request to the index.php script
RewriteRule .* wp_dir/index.php [L]
#
## End - Joomla! core SEF Section.

RewriteCond %{HTTP_REFERER} !^(http|https)://example.com/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^(http|https)://example.com$      [NC]
RewriteCond %{HTTP_REFERER} !^(http|https)://www.example.com/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^(http|https)://www.example.com$      [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|bmp)$ - [F,NC]

# non-www
RewriteBase /
#RewriteCond %{REQUEST_URI} !^/(robots\.txt|favicon\.ico|sitemap\.xml)$
RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
# 2017-03-06
RewriteCond %{HTTPS} OFF
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

#RewriteCond %{REQUEST_URI} !^/(robots\.txt|favicon\.ico|sitemap\.xml)$
RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
# 2017-03-06
RewriteCond %{HTTPS} ON
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]


# Wordpress
#RewriteCond %{REQUEST_URI} ^/(wp_dir/|wp_dir/.*)$
#RewriteRule ^.*$ - [L]

#RewriteCond %{HTTP_HOST} ^(www.)?example.com$
#RewriteRule ^(/)?$ wp_dir[L]


<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/wp_dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /wp_dir/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ wp_dir/index.php [L] 
</IfModule>

РЕДАКТИРОВАТЬ: добавлены заголовки

Это заголовки, полученные в двух разных браузерах ,

В Firefox я получаю 301, и URL остается на «http: // www.example.com».

Заголовки ответа:

HTTP/1.1 301 Moved Permanently
Server: Sucuri/Cloudproxy
Date: Thu, 05 Mar 2020 17:31:13 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 335
Connection: keep-alive
X-Sucuri-ID: 15020
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-Sucuri-Cache: HIT

Запрос заголовков :

Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1

Это заголовки в Chrome, где я получаю 404 и URL "https: // www.example.com/wp_dir/":

Общее :

Request URL: https://www.example.com/wp_dir/
Request Method: GET
Status Code: 404 
Remote Address: 192.124.249.120:443
Referrer Policy: no-referrer-when-downgrade

Заголовки ответов :

cache-control: no-cache, must-revalidate, max-age=0
content-encoding: gzip
content-length: 14112
content-security-policy: upgrade-insecure-requests;
content-type: text/html; charset=UTF-8
date: Thu, 05 Mar 2020 17:27:18 GMT
expires: Wed, 11 Jan 1984 05:00:00 GMT
link: <https://www.example.com/wp-json/>; rel="https://api.w.org/"
server: nginx
status: 404
vary: Accept-Encoding,User-Agent
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-sucuri-cache: EXPIRED
x-sucuri-id: 15020
x-xss-protection: 1; mode=block

Заголовки запросов :

:authority: www.example.com
:method: GET
:path: /wp_dir/
:scheme: https
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding: gzip, deflate, br
accept-language: es-ES,es;q=0.9,ca;q=0.8,en;q=0.7,fr;q=0.6,ro;q=0.5,gl;q=0.4
cookie: pll_language=es; wp-settings-1=editor%3Dtinymce%26edit_element_vcUIPanelWidth%3D1379%26edit_element_vcUIPanelLeft%3D0px%26edit_element_vcUIPanelTop%3D74px%26libraryContent%3Dbrowse; wp-settings-time-1=1580451182; wordpress_test_cookie=WP+Cookie+check; _ga=GA1.2.2063032164.1566356615; __utma=98619150.2063032164.1566356615.1566523591.1566602595.2; d50c875bad7fd1a5e131e638c3965ba3=es-ES; pll_language=es; wordpress_test_cookie=WP+Cookie+check
sec-fetch-mode: navigate
sec-fetch-site: none
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36

1 Ответ

1 голос
/ 06 марта 2020

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

Поскольку, если запрос сделан где-либо на сайте и если он не прямой файл или каталог. Файл root htaccess перенаправит его в подпапку.

Теперь ваш файл .htaccess второй подпапки фактически указывает на каталог root. Если вы хотите иметь перенаправление .htaccess в подпапке, вы должны добавить базу перезаписи и подпапку к перенаправлению.

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

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wp_dir/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp_dir/index.php [L]
</IfModule>
# END WordPress
Если вы посмотрите это учебное пособие Hostinger , в нем предлагается не использовать условие RewriteEngine On дважды. И это хорошее объяснение этой "проблемы".

Но если вы используете RewriteEngine или RewriteBase несколько раз, последняя запись выигрывает и используется во всем файле .htaccess.

Теперь я не понимаю, вы получили доступ к https://example.com/wp_dir/ напрямую или вас туда перенаправили? Если бы это был прямой доступ, я думаю, что .htaccess был неправильным, как я указал.

Или это может быть кеш телефона.

Редактировать: А также изменить первый файл .htaccess. Я думаю, что одно правило перезаписи https является избыточным, а другое - неправильным.

# SSL rewrite
RewriteEngine On
# RewriteCond %{SERVER_PORT} 80
# I think this shouldn't matter but lets use the same method for consistency
RewriteCond %{HTTPS} Off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,NE]

RewriteBase /
# RewriteEngine is already On
# RewriteEngine On

# non-www 
# RewriteBase /
# RewriteBase is already defined
# if we want to redirect to https lets specify that
#RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
#RewriteCond %{HTTPS} OFF
# RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
#RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
# But I think the very first directive should take care of this

# If we're using https why redirect to it?
# Or am I missing something?
#RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
#RewriteCond %{HTTPS} ON
#RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/wp_dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /wp_dir/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ wp_dir/index.php [L] 
</IfModule>

Файл, как я бы сказал

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} Off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,NE]

  RewriteCond %{HTTP_HOST} ^(www.)?example.com$
  RewriteCond %{REQUEST_URI} !^/wp_dir/
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ /wp_dir/$1
  RewriteCond %{HTTP_HOST} ^(www.)?example.com$
  RewriteRule ^(/)?$ wp_dir/index.php [L] 
</IfModule>

Я могу ошибаться.

...