Сайт Yii с процентным кодированием # char (% 23) в определенных URL-адресах не разрешается

Последнее редактирование: кажется, я понял это! Ответ ниже.

Редактировать второе: я думаю, что Apache, как правило, является огромной проблемой в тылу, но я не в состоянии переключать производственные веб-серверы с Litespeed (собственный 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 и код ничего не дает. Вот, однако, для справки:

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]

person Dmitri DB    schedule 24.06.2013    source источник


Ответы (1)


Теперь я понял это благодаря дружелюбному незнакомцу на freenode, который подключил его к следующему сумасшедшему обходному пути регулярного выражения лунного языка:

RewriteRule ([^#]+)#?([^#]*) /index.php/$1$2 [L,QSA,NC]

По-видимому, я на самом деле не говорю на сумасшедшем лунном языке, но я предполагаю, что это означает следующее: он говорит, что совпадение $1 () - это группа символов из чего-либо, кроме # ([^#] означает не #) до #, а затем совпадение $2 такое же с другой стороны, с подстановочным знаком * после любого инцидента #.

Приветствую всех, кто вообще подумал об ответе!

person Dmitri DB    schedule 24.06.2013