1

最終編集:私はこれを理解したようです!以下に答えてください。

編集 2: Apache は一般的に後部の大きな問題だと思いますが、実稼働 Web サーバーを Litespeed (独自の apache) から nginx に切り替える立場にはありません。これらの URL は問題なく解決されます。しかし、ええ、メモとして-これはnginxで問題なく動作します。

編集 3:次の RewriteRule は、私を助けようとした freenode の友好的な仲間からこれまでのところ理解されています。

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

このクレイジーな月言語の正規表現がいかにクールに見えても、ハッシュが含まれる URL に対してのみ機能し、それ以外は無効になります。これらの RewriteRules が 404 などの場合にフォールバックする方法はありますか?

編集 4:誰かが提案した:

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+-+"

明確にするために、私は、派手にエスケープされた AJAX URL や、Google で解決策を探したときに表示されるようなものを探しているわけではありません。これは単に、この特定のサイトにある特定の既存のアイテムの束の問題であり、URL に # 文字が存在するために解決されていません。これは、アイテムのタイトルから派生した値であり、人々が好きな場所です。どこにも行かないハッシュタグを投げたり、アップロードされたアイテムのタイトルに「私は#1です」のようなものを投げたりします。

ここにキッカーがあります -- Yii には、スクリプト名 (index.php) を非表示にするオプションがあります。

showScriptName => 'false'

config/main.php のディレクティブ。サイトの運営者によると、これはサイトの望ましい動作です。ただし、ハッシュを含む URL はそれがないと機能しないため、現時点では showScriptName を無効にしています。これにより、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]

config/main.php の urlManager 配列:

'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 ファイルを作成する前に正常に機能していたようです。これは、以前の化身では、opengraph の静的画像ファイル リンクにアクセスできる Facebook を作成していました。私は、バックアップを使用してテストすることに基づいて、以前は正常に機能していたというこの主張に異議を唱えます-古い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]
4

1 に答える 1

0

freenode のフレンドリーな見知らぬ人が、次のクレイジーな月言語の正規表現の回避策を使って接続してくれたおかげで、今では理解できました。

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

どうやら私はクレイジーな月語をあまり話せないようですが、これは私が推測する意味です: match $1 () は、# を含まない ([^#] は # でないことを意味する) から # までの文字グループであると言っています。 match $2 は反対側と同じで、インシデント # の後にワイルドカード * が付きます。

答えを考えた他の人に乾杯!

于 2013-06-24T03:37:10.400 に答える