Ошибка перенаправления 404 с вложенной папкой public_html в качестве корневой папки для веб-сайта

#.htaccess

#.htaccess

Вопрос:

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

public_html/newversion/index.php

public_html/newversion/category.php

public_html/newversion/category/information.php

Я отредактировал файл .htaccess в public_html, чтобы принудительно использовать не www и https, установил newversion в качестве нового корня документа и некоторый код для удаления расширения .php из URL-адресов (см. Код .htaccess ниже).

Это означает, что я хочу newversion/index.php появляться, когда кто-то идет в example.com , вместо того, чтобы человек, нуждающийся в том, чтобы пойти в example.com/newversion/index.php .

Все работает нормально, за исключением случаев, когда я пытаюсь получить доступ category.php или information.php . Затем браузер автоматически перенаправляется на example.com/newversion/category.php и я получаю ошибку 404. Когда я пытаюсь получить доступ information.php , браузер пытается открыть example.com/category/information.php , но я также получаю ошибку 404.

Что я делаю не так? (К вашему сведению, WordPress больше не установлен)

     # Apache Rewrite Rules
    <IfModule mod_rewrite.c>
    Options  FollowSymLinks
    RewriteEngine On
    RewriteBase /

    # Base Redirects #

    # Remove trailing slash from non-filepath urls
    RewriteCond %{REQUEST_URI} /(. )/$
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ https://example.com/%1 [R=301,L]

    # Include trailing slash on directory 
    RewriteCond %{REQUEST_URI} !(. )/$
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^(. )$ https://example.com/$1/ [R=301,L]

    # Force HTTPS and remove WWW
    RewriteCond %{HTTP_HOST} ^www.(.*)$ [OR,NC]
    RewriteCond %{https} off  
    RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

    # Change root folder to subfolder of public_html
    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}/newversion%{REQUEST_URI} -f [OR]
    RewriteCond %{DOCUMENT_ROOT}/newversion%{REQUEST_URI} -d [OR]
    RewriteCond %{DOCUMENT_ROOT}/newversion%{REQUEST_URI} -l 
    RewriteRule ^ /newversion%{REQUEST_URI} [L]

    RewriteEngine On

    # Redirect external .php requests to extensionless url
    RewriteCond %{THE_REQUEST} ^(. ).php([#?][^ ]*)? HTTP/
    RewriteRule ^(. ).php$ http://%{HTTP_HOST}/$1 [R=301,L]

    # Resolve .php file for extensionless php urls
    RewriteRule ^([^/.] )$ $1.php [L]

    # Set php version
    AddHandler application/x-httpd-recommended-php .php .php5 .php4 .php3

    </IfModule>

    # Restrict access
    <Files .htaccess>
    order allow,deny
    deny from all
    </Files>
 

Ответ №1:

Мне потребовалось много времени, чтобы разобраться в этом, но теперь я знаю, что люди подразумевают под .htaccess Rewrite voodoo … Итак, для тех, кто все еще нуждается в ответе:

В конце концов, порядок, в котором вы объявляете правила htaccess, и подкаталог, в котором вы это делаете, имеют большое значение. Не спрашивайте меня, как именно это работает, потому что я не до конца понимаю. Однако этот код сработал для меня.

Базовый код обеспечивает следующее:

  • корень веб-сайта в подкаталоге
  • принудительно использовать не www и https
  • удалить расширение .php из url
  • откройте подкаталоги как example.com/foo / вводится или не вводится с завершающей косой чертой
  • открывайте файлы в подкаталогах как example.com/foo/bar вводится или не вводится с завершающей косой чертой

файл .htaccess в public_html:

 # htaccess for public_html

Options -Indexes  FollowSymlinks -MultiViews
ErrorDocument 404 /404.php

# Remove www and force https
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

# add a trailing slash if public/$1 is a directory
RewriteCond %{DOCUMENT_ROOT}/subdirectory/$1 -d
RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L,R=301]

#Prevent direct access to PHP Scripts
RewriteCond %{THE_REQUEST} .php[?/s] [NC]
RewriteRule ^ - [R=404,L]

RewriteRule ^/?$ subdirectory/ [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^((?!subdirectory/).*)$ subdirectory/$1 [L,NC]
 

Затем в подкаталог добавьте следующий файл htaccess:

 # htaccess for subdirectory

# Remove trailing slashes (keep as first rule!)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(. )/$ /$1 [NE,R=301,L]

# Open page without php extension
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.] )$ $1.php [NC,L]