8

prettyPhotoはハッシュタグを利用しますが、ハッシュタグが(%23まで)エンコードされると、ほとんどのブラウザで404エラーが発生します。これは以前に議論されました

#callback部分がURLの一部ではないため、404エラーが発生します。これはブラウザで使用されるブックマークであり、リクエストでサーバーに送信されることはありません。ハッシュをエンコードすると、代わりにファイル名の一部になります。

  1. URIエンコードされているという理由だけで、ハッシュがファイルの一部になるのはなぜですか?バグじゃないですか?

  2. 質問しているのは、prettyPhotoがハッシュタグを使用していて、同じ問題が発生しているためです。'?'を追加すると思います ハッシュが最も洗練されたソリューションになる前に、既存のコードでハッシュを実行する方法が少し途方に暮れています。

    関数getHashtag(){
    url = location.href;
    hashtag = url.indexOf('#gallery')!==-1)?decodeURI(url.substring(url.indexOf('#gallery')+ 1、url.length)):false;
    ハッシュタグを返す;
    }
    関数setHashtag(){
    if(typeof theRel =='undefined')return; location.hash = theRel +'/' + rel_index +'/';
    }
    関数clearHashtag(){
    if(location.href.indexOf('#gallery')!==-1)location.hash = "";
    }
  3. 他に何か提案はありますか?404ページを微調整することを検討しますが、それは問題を防ぐというよりは、問題を処理することに似ているようです。

ありがとう!

編集: 明らかに、prettyphotoがこれらのハッシュを処理する方法に問題はないので、これらのルールをApacheサーバーに追加することになりました。

RewriteRule ^(.*).shtml(%23|#)$ /$1.shtml [R=301,NE,L]
RewriteRule ^(.*).shtml([^g]+)gallery(.+)$ /$1.shtml#gallery$3 [R=301,NE,L]

%23が問題を引き起こしたケースをうまく処理します。

4

2 に答える 2

10
  1. Why would a hash become part of the file just because it's URI-encoded? Isn't it a bug?

If you point your browser to http://example.com/index.html#title, the browser interprets this to make a request for the file index.html from the server example.com. Once the request is complete, the browser looks for an anchor element in the document with the name of 'title' (i.e. <a name="title">My title</a>).

If you instead point to http://example.com/index.html%23title, the browser makes a request for the file index.html%23title from example.com, which probably doesn't exist on the server, giving you a 404. See the difference?

And it's not a bug. It's part of an internet standard last updated in 1998. See RFC 2396. Quoting:

The character "#" is excluded because it is used to delimit a URI from a fragment identifier in URI references (Section 4).

As for 2 and 3, there's not enough context in your example code to tell what you're trying to do. How are you calling your code? What are you trying to do with prettyphoto that isn't working? Are you trying to redirect to a specific photo or gallery from a user click or other javascript event? Are you trying to open the gallery when someone visits a particular page?

I checked the linked question with twitter/oauth, but I don't see how that ties into the code you provided. I started poking at prettyphoto as well, but I don't see how your code relates to that either.

Instead of changing your 404 page, maybe what you need is an in-code handler or server rewrite rule that takes not-found requests with a %23 in them and redirects the user to the decoded url. That could have some drawbacks, but it would be fairly elegant if you're taking incoming requests from other sources you can't control. What is your server environment? (language, server tech, who owns the machine, etc.)

I'd be happy to update my answer with a solution or a work around for you.

于 2012-07-20T23:47:48.227 に答える
2

#1に答えるには)

ブラウザー/サーバー/その他が解析する方法を知っているトークンではなくなるため、URL の一部になります。

つまり、「?」URL で重要な役割を果たします。サーバーは、前のものと後のものを区別することを認識しています。ブラウザーは、URI で何が動的で何が動的でないかを気にする必要はありません。すべて重要です (ただし、JavaScript は場所オブジェクトの値を分離します)。

ハッシュタグにはブラウザにとって特別な意味があるため、ブラウザは「#......」をサーバーに送信しません。

ただし、JavaScript でそのハッシュをエスケープすると、ブラウザはそのエスケープされた文字列をリテラル値としてサーバーに送信することを躊躇しません。

なぜそうしないのですか?検索クエリに正当にハッシュ文字が必要な場合 (Facebook ウォールに POST リクエストを送信し、電話番号を送信している場合)、失敗することになります。または、411.​​com などである番号の GET ベースの検索を行っているのに、彼らは自分たちのアプリケーションについてあまり考えていません。

問題は、エスケープされた値が実際のパスで発生している場合、エスケープされた値が URL とは別に保持されることをサーバーが理解できないことです。

エスケープ文字を受け入れる必要があります。そうしないと、ファイル名/パス/クエリ/値で有効なスペース (%20) やその他の日常的な文字が問題を引き起こす可能性があります。

あなたが探しているなら:

//mysite.gov.on.ca/path/to/file.extension%23action%3Dfullscreen

404.

あなたにできることがいくつかあります、私は確信しています。最初のものはApacheにありますが、提供しているものが何であれ、最初の「%23」までの任意のURLに一致する正規表現を書くことができます。予め。

それほど魂を引き裂く実装では、プラグインに適した「#」をエスケープする方法があるかどうかを調べる必要があります。

たとえば、Google は「ハッシュバン」戦略 (「#!」) を使用して、エンコードするかどうかを知るために URL をそのように送信するように要求します。

url.indexOf("#");他のオプションとして、ハッシュで URL を使用して分割し、有効な部分を送信して「#」文字をチェックすることもできます。

それは実際に何を達成しようとしているのかにかかっています。それが問題である理由を指摘することはできますが、問題をなくす最善の方法は、何をしようとしているか、どのようにしようとしているかによって異なりますそれを行うこと、および作業しているコンテキストで許可されていること。

于 2012-07-21T00:04:54.730 に答える