Проблема с использованием .htaccess для замены символов в URL - PullRequest
0 голосов
/ 04 сентября 2010

Я пробовал десятки разных способов сделать это, но не могу заставить их работать. Мой .htaccess делает несколько вещей, например, устанавливает пользовательский 404 и блокирует хотлинкинг изображений. Я хочу сделать две вещи в URL: добавить www. если его там нет (довольно раздражающий логин Facebook не может справиться с двумя разными источниками!), и заменить // на /, за исключением http:.

Я пробовал это:

# Replace // with /
RewriteCond %{REQUEST_URI}     (.*)(?<!http:)\/{2,5}(.*)
RewriteRule .*                 %1/%2 [R=301,L]

А это:

# Replace // with /
RewriteCond %{REQUEST_URI}     (.*).com\/\/(.*)
RewriteRule .*                 %1.com/%2 [R=301,L]

И все виды перестановок. Кто-нибудь может сказать мне, что я делаю не так?

Мне нужно сделать это, потому что иногда между .com и остальной частью URL вставляется несколько / s.

Спасибо

Ответы [ 3 ]

1 голос
/ 04 сентября 2010

Вот как заставить www.:

<IfModule mod_rewrite.c>
#Add WWW
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
#End Add WWW
</IfModule>

Учитывая то, что @Tim упомянул ниже, я бы проверил %{REQUEST_URI}, если он содержит //, и это будет мой RewriteCond:

<IfModule mod_rewrite.c>
#Replace // with /
RewriteCond %{REQUEST_URI} // [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
#End Replace // with /
</IfModule>
1 голос
/ 04 сентября 2010

Я не думаю, что http:// вообще является частью REQUEST_URI (или любой другой переменной среды в этом отношении). Он будет проанализирован браузером и использован для определения характера запроса задолго до фактического запроса.

Я могу ошибаться, но я думаю это невозможно исправить на уровне htaccess. Во-первых, ссылка должна быть правильно отформатирована.

Обновление: Глядя на информацию, которую Apache передает PHP, я думаю, что я прав. Протокол, используемый для создания запроса, не является частью компонентов URI, с которыми мы можем играть.

0 голосов
/ 04 сентября 2010

Я не уверен, почему у вас возникают проблемы с несколькими слэшами, так как он может разрешить файл в любом случае.Тем не менее, можно проверить и удалить их с помощью перенаправления (я объединил это с вашей силой- www, поэтому существует не более одного внешнего перенаправления):

RewriteCond %{THE_REQUEST} ^[A-Z]+\s[^\s]*/{2,} [OR]
RewriteCond %{HTTP_HOST}  !^www\.
RewriteCond %{HTTP_HOST}   ^(www\.)?(.*)$
RewriteRule ^ http://www.%2%{REQUEST_URI} [R=301,L]

Обратите внимание, что %{REQUEST_URI}Удалил дублирующиеся косые черты (только в mod_rewrite, позже это не так для скриптов), поэтому мы можем использовать его в перенаправлении, чтобы автоматически решить эту проблему для нас.Исходный запрос все равно будет иметь несколько косых черт, поэтому мы проверяем их, проверяя %{THE_REQUEST}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...