Сайт Yii с символом # char (%23) в определенных URL-адресах не разрешается
Окончательное редактирование: кажется, я понял это! Ответ ниже.
Отредактируйте два: я думаю, что Apache, как правило, вызывает огромную боль в тылу, но я не в состоянии переключать рабочие веб-серверы с Litespeed (Proprietary apache) на nginx, где эти URL-адреса разрешаются без проблем. Но да, просто как примечание - этот материал прекрасно работает в nginx.
Отредактируйте три: следующее RewriteRule было выяснено так далеко от дружественного сотрудника на freenode, который пытался мне помочь:
RewriteRule ([^#]+)#([^#]+) /index.php/$1¦$2 [L,QSA,NC]
Каким бы классным не выглядело это сумасшедшее регулярное выражение на языке луны, оно работает только для URL-адресов с хешем в них - оно разрушает все остальное Есть ли способ заставить эти RewriteRules отступить, если они 404 или что-то подобное?
Редактировать четыре: Кто-то предложил:
FallbackResource /index.php
Не повезло, либо.
Оригинальный вопрос:
Я работаю над сайтом, который имеет определенные URL-адреса, имеющие URL-адреса, которые получены из заголовка элемента (в качестве примера для заголовка thisUrlDerivedFromUrl - #example), которые выглядят примерно так:
http://example.com/listen/thisUrlDerivedFromItemTitle+-+%23example-mid26372
Это, однако, приводит меня к следующей странице ошибки 404, где вы можете видеть, что запрос обрезается в #, закодированном как%23:
Error 404
Unable to resolve the request "listen/thisUrlDerivedFromItemTitle+-+"
Чтобы быть ясным, я не ищу причудливые экранированные URL-адреса AJAX или что-то подобное, которое возникает, когда я пытаюсь найти решения в Google. Это просто проблема набора определенных ранее существующих элементов на этом конкретном сайте, которые не решаются из-за присутствия символа # в URL, который является значением, полученным из заголовка элемента, где людям нравится бросать хэштеги, которые никуда не денутся, и тому подобное или что-то в этом духе, например, "я - № 1", в заголовке своих загруженных элементов.
Итак, вот кикер - в Yii есть возможность скрыть имя скрипта (index.php), используя
showScriptName => 'false'
директива в config / main.php. Это желаемое поведение сайта, по словам оператора сайта. Однако пока у меня отключен showScriptName, потому что URL-адреса с хэшами в них не работают без него, поэтому все URL-адреса выглядят примерно так:
http://example.com/index.php/listen/thisUrlDerivedFromItemTitle+-+%23example-mid26372
Дело в том, что этот формат URL разрешается просто отлично, без ошибок 404 или чего-то в этом роде. Я не думаю, что мой работодатель доволен этим компромиссом.
Я предоставлю свой.htaccess, а также то, как мой массив urlManager выглядит в config / main.php, в надежде, что кто-то может иметь какой-то ответ до конца, когда найдет решение этой проблемы. Любые идеи или что-то еще, чем я мог бы поделиться, чтобы найти решение, полезны и ценятся заранее:)
.htaccess:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\?*$ index.php/$1 [L,QSA]
массив urlManager в config/main.php:
'urlManager' => array(
'urlFormat' => 'path',
'showScriptName' => true,
'rules' => array(
'user/<_a:(register|update|forgottenpassword)>' => 'user/<_a>',
'user/<username>' => 'user/view','user/<username>/<_a>' => 'user/<_a>',
'listen/<title>-mid<id>' => 'mixtape/listen'),
),
РЕДАКТИРОВАТЬ: Очевидно, что эти URL работали хорошо, прежде чем я пошел и разоблачил файл htaccess, который в своем предыдущем воплощении отключил Facebook, чтобы получить доступ к статическим ссылкам на файлы изображений для opengraph. Я оспариваю это утверждение, что оно работало нормально, прежде чем основывалось на тестировании его с резервными копиями - переключение обратно на старый htaccess & code делает zilch. Вот для справки, однако:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://example.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://example.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.example.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.example.com$ [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|bmp|mp3|zip)$ - [NC,F,L]
RewriteBase /
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
# otherwise forward it to index.php
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.* - [F,L]
RewriteRule ^.*$ index.php [NC,L]
1 ответ
Теперь я понял это благодаря дружелюбному незнакомцу на freenode, подключившему его с помощью следующего сумасшедшего обходного решения на языке луны:
RewriteRule ([^#]+)#?([^#]*) /index.php/$1$2 [L,QSA,NC]
По-видимому, я действительно не говорю на сумасшедшем лунном языке, но это то, что я понимаю, это означает: он говорит, что match $1 () - это группа символов всего, кроме # ([^#] означает не #) до #, а затем совпадение $2 - то же самое с другой стороны, с подстановочным знаком * после любого инцидента #.
Привет всем, кто обдумал ответ!