Тщеславные URL-адреса без косой черты в конце на Apache

Приведенный ниже код изменяет все URL-адреса в каталоге /profiles/ на нашем сайте с example.com/profiles/name/ на example.com/name/, но мы также хотели бы удалить завершающие косые черты, чтобы еще больше упростить результирующие URL-адреса до более красивого example.com/name — как в современных социальных сетях.

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

Как это можно сделать (и сделать безопасно)? Мы видели несколько решений на Stumble Upon, которые, возможно, могли бы работать вместе, но все профили на нашем сайте в настоящее время имеют свои собственные физические каталоги, а не собираются на лету с помощью сценария.

Обновление: @jon-lin предложил решение для аналогичной ситуации по адресу Как получить доступ к index.php каталога без завершающей косой черты И не получить перенаправление 301 -- но мы не выяснили, как это сделать применим его к нашему (описано выше).


person haadaa    schedule 20.10.2015    source источник


Ответы (4)


Вы можете попробовать сделать

RewriteRule ^(.*)/+$ $1 [R=301,L]

Что должно работать для любого URL

person NooBskie    schedule 20.10.2015
comment
Привет @NooBskie! Мы только что попробовали, но, протестировав это в Google Chrome, example.com/name/ перенаправили на URL-адрес, содержащий всю внутреннюю структуру каталогов, и example.com/name на поиск Google. - person haadaa; 20.10.2015

Вам нужно отключить косую черту каталога

Пытаться :

DirectorySlash Off

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /profiles/$1 [NC,L]
person Amit Verma    schedule 20.10.2015
comment
Привет @Старкин! Это не сработало -- example.com/name теперь запрещено -- У вас нет разрешения на доступ к /profiles/name на этом сервере. - person haadaa; 20.10.2015

Используйте следующее перенаправление:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /(.+)/+$
RewriteRule ^ /%1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /profiles/$0 [NC,L]
person hjpotter92    schedule 20.10.2015
comment
Привет @ hjpotter92 - это привело к тем же ошибкам, что и решение NooBskie. - person haadaa; 20.10.2015
comment
Спасибо! Это снова перенаправляет обратно на поиск Google в Chrome; в Safari и Firefox он перенаправляет example.com/name обратно на example.com/profiles/name. - person haadaa; 20.10.2015
comment
@haadaa Не могли бы вы уточнить, что вы имеете в виду под: Это снова перенаправляет обратно на поиск Google в Chrome? - person hjpotter92; 20.10.2015
comment
Привет, @hjpotter92 Конечно, с вашим кодом браузер Google Chrome обрабатывает example.com/name как поиск example.com/name, то есть при вводе example.com/name в комбинированной строке поиска/URL Chrome отображает результаты поиска для example.com/name, а не страницы (и свои ошибки). Я предполагаю, что это их способ защитить сайты от показа содержимого их каталогов (что действительно представляет собой риск, если завершающие косые черты удалены неправильно). - person haadaa; 20.10.2015
comment
Привет, @hjpotter92 Поскольку все наши профили имеют свои физические страницы по адресу example.com/profiles/name/index.html, можно ли сделать это с помощью чего-то похожего на RewriteRule ^.*$ /profiles/$0/index.html [NC,L]? - person haadaa; 20.10.2015

Добавив часть кода, предложенного @jon-lin в Как получить доступ к index.php каталога без завершающей косой черты И не получить перенаправление 301 (внутренняя перезапись косой черты обратно), мы действительно сделали эту работу:

# Vanity URLs

DirectorySlash Off

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

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/

Профиль Gucci в FASHION NET (расположенный по адресу /profiles/gucci/) теперь доступен по адресу https://www.fashion.net/gucci -- без косой черты в конце! Спасибо, @jon-lin!!!!

person haadaa    schedule 12.11.2015