Создание дружественных URL-адресов без использования недружественного URL-адреса для всех

Как известно многим, можно сделать дружественный URL-адрес с mod_rewrite в файле .htaccess следующим образом:

RewriteRule ^category/(.*)$ /somescript.php?category=$1 [L]

Это работает до тех пор, пока somescript.php находится в корневой папке документа на сервере. Если кто-то смог угадать фактический скрипт (пример: если они набрали: http://example.com/somescript.php?category=whatever вместо http://example.com/category/whatever), тогда вероятность дублирования контента высока, потому что в какой-то момент кто-то поделится ссылками и может быть проиндексирован в поисковых системах.

То, что я ищу, - это способ сделать somescript.php недоступным для общественности, но публика должна иметь доступ к дружественному URL.

Я попытался использовать ScriptAliasMatch с теми же параметрами, что и RewriteRule, за исключением того, что я добавил / после ^, и я удалил [L]. Я переместил сценарий в папку на один уровень из public_html, и я установил имя пользователя и группы для папки так же, как и пользователь и группа Apache, а разрешения файла PHP - 0x755.

Когда я пытаюсь получить доступ к файлу, я получаю код статуса 403, а в Apache error_log я получаю

  

клиент отказался от конфигурации сервера: /path/to/somescript.php

Я также установил loglevel для отладки.

Кто-нибудь еще успел запустить сценарии в недоступных для общественности местах, когда публика запрашивает дружественный URL-адрес? Если да, как вы это сделали?

И я добавил строку Disallow: /*? в свой файл robots.txt, но я думаю, что мне нужно сделать больше, чем некоторые боты 't уважать robots.txt.

2 голоса | спросил Mike 22 AM00000050000000131 2015, 05:44:01

1 ответ


1

Вы можете перенаправить извне из URL-адреса «уродливого» (не для лучшего) URL-адреса на «дружественный» URL-адрес. Тем не менее, вам нужно быть осторожным в цикле перенаправления /перезаписи. Один из способов избежать цикла перезаписи - проверить код THE_REQUEST - он содержит начальный заголовок запроса, отправленный клиентом, и не изменяется как перезаписывающий движок перезаписывает URL-адрес.

Для этого нужно перед выполнить текущую внутреннюю перезапись :

RewriteCond %{THE_REQUEST} \?(category)=([\w-]*)
RewriteRule ^somescript\.php$ /%1/%2? [R=302,L]

[\w-]* - Предполагается, что category может состоять только из символов a-z, A-Z, 0-9, _ и -. Лучше сделать это как можно более ограничительным. Однако это также означает, что вы также должны изменить шаблон .* в своем внутреннем переписывании для соответствия.

Измените R=302 (временный) на R=301 (постоянный), когда вы уверены, что он работает нормально.

  

вероятность дублирования контента высока.

Если структура URL не изменяется или существует некоторая неправильная конфигурация, которая предоставляет «уродливый» URL-адрес, тогда шансы найти и индексировать «повторяющийся контент» должны быть низкими.

Проблема с «дублирующимся содержимым» также может быть разрешена (или безопасно защищена) с помощью тега rel="canonical", который, вероятно, В любом случае, хорошая идея.

  

Я попытался использовать ScriptAliasMatch ...

Использование Alias не будет устранять любые повторяющиеся проблемы с содержимым, так как оно не изменяет URL.

ответил MrWhite 22 PM000000120000000831 2015, 12:30:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132