.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 ваш браузер может запомнить перенаправление "портфолио" на "портфолио/" и выполнить перенаправление до того, как он даже отправит запрос на сервер. Обязательно протестируйте в чистой, чистой среде с кешем для достижения наилучших результатов.