.htaccess, правильная переписывание каталога и файла с тем же именем

На данный момент у моего сайта есть несколько статических страниц, один из которых - портфолио. Помимо прочего, htaccess скрывает расширение .html. Я хотел бы добавить каталог портфолио, но я не хочу переместить мою существующую страницу портфолио в каталог портфолио как индексный файл по умолчанию. Моя страница/портфолио является одной из моих дополнительных ссылок Google, и я боюсь, если она будет перемещена или если URL-адрес изменится каким-то образом, Google рассмотрит ее как новую страницу.

Моя проблема заключается в том, что когда я добавляю каталог /portfolio/, когда я пытаюсь посетить страницу оригинала/портфолио, автоматически добавляется конечная косая черта и она привязывается к самому каталогу.

Я пробовал бесчисленные варианты, один из которых был переписыванием/портфолио/в/портфолио, однако это создает бесконечный цикл. Я также попробовал "DirectorySlash Off", но только удалив конечную косую черту во время нахождения внутри каталога, она не вернула доступ к исходной странице/портфолио.

В конечном счете, я хотел бы сохранить мою/портфолио как-есть, ссылаясь на страницы внутри каталога, например, так/портфолио/пример, и если к нему обращается портфолио/портфолио//портфолио, это приведет к отображению той же самой страницы, находится вне каталога без Google, думая, что это дублированный контент.

Аналогичный вопрос существует здесь: .htaccess переписывать url на страницу или каталог, хотя это по-прежнему приводило к бесконечному циклу для меня по какой-то причине, я думаю, что это имеет какое-то отношение к скрытым расширениям.

Здесь мой htaccess -

RewriteEngine On

# HTML to PHP
RemoveHandler .html .htm
AddType application/x-httpd-php .htm .html

# Hide extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

# Force WWW
RewriteCond %{HTTP_HOST} ^mydomain\.net
RewriteRule ^(.*)$ http://www.mydomain.net/$1 [R=301,L]

# Blog Subdomain
RewriteCond %{HTTP_HOST} ^blog.mydomain.net$
RewriteRule ^(.*)$ http://www.mydomain.net/blog/$1 [R=301,L]

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

Ответ 1

Здесь две вещи идут "неправильно" и два способа исправить это.

Во-первых, apache "определяет", что существует каталог с именем "портфолио" до того, как будут применены условия перезаписи. Это означает, что условия перезаписи получают "портфолио/" вместо "портфеля".

Во-вторых, правило "! -d" специально избегает перезаписи, которую вы хотите сделать, если на самом деле есть каталог с этим именем

Решение 1: вручную переадресовать запросы для каталога портфолио для удаления косой черты.

# Manually re-route portfolio/ requests to portfolio
RewriteCond %{REQUEST_FILENAME} portfolio/$
RewriteRule ^(.*)/$ $1 

# Hide extension
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

Обратите внимание на удаление условия "! -d".

Недостатком этого является то, что вам приходится жестко закодировать регистр "портфолио" непосредственно в правила перезаписи и все равно приведет к тому, что браузер будет сначала перенаправлен в портфолио /

Решение 2: Установите "DirectorySlash" и "Удалить каталог существует тест

# Disable Automatic Directory detection
DirectorySlash Off

# Hide extension
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

Настройка DirectorySlash Off решила бы эту проблему лучше всего, но может сломать другие части вашего сайта, где вы действительно хотите использовать auto DirectorySlash. Лучшее из удачи, и я надеюсь, что это поможет.

Обратите внимание, что при тестировании решения 2 ваш браузер может запомнить перенаправление "портфолио" на "портфолио/" и выполнить перенаправление до того, как он даже отправит запрос на сервер. Обязательно протестируйте в чистой, чистой среде с кешем для достижения наилучших результатов.