#.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]