-1

いくつかの書き換えルールを使用して、フォーラムの読み取り可能な URL を作成します。たとえば、「この新しい車についてどう思いますか?」という件名の新しいトピックを投稿したとします。私はこのようなリンクを作成します: forum/cars/51-Hey-what-do-you-think-of-this-new-car-?51 はトピック ID です。

私の .htaccess では、次の書き換えルールを使用します。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^forum/([0-9-a-z]+)/?$ forum/list_topics.php?key=$1 [L]
RewriteRule ^forum/([0-9-a-z]+)/([0-9]+)?$ forum/list_topics.php?key=$1&page=$2 [L]
RewriteRule ^forum/([0-9-a-z]+)/([0-9]+)-(.*)/?$ forum/list_post.php?topic=$2 [L]

したがって、これらの文字を含む件名を投稿する場合を除いて、これは正常に機能しています: +"*ç%&/()=?'^

私はphp関数を使用してURLを作成します:

$url_topic = str_replace(' ', '-', $url_topic); //replace space with -
$url_topic = urlencode($url_topic);//encode url

この場合、 $url_topic の値は : です34-%2B%22%2A%C3%A7%25%26%2F%28%29%3D%3F%27%5Eが、クリックすると次のエラーが表示されます:

Not Found

The requested URL /forum/cars/34-+"*ç%&/()=?'^ was not found on this server.
Apache/2.2.22 (Ubuntu) Server at localhost Port 80

私は何が欠けていますか?

ありがとう

4

1 に答える 1

0

URL エスケープされた文字列は、RewriteRule と暗黙的に比較する文字列でデコードされます。つまり、キャプチャした場合、それらは既にデコードされています!.

IMO、最善の解決策は、クライアントが行った方法でまだ URL エンコードされている %{THE_REQUEST} に対してキャプチャすることです。これには 1 addl RewriteCond が必要です。

2 番目のオプションは、[B] フラグを使用して後方参照を再エスケープすることです。私はこれのファンではありません。なぜなら、再エスケープは置換がどこに行くのかを実際にはコンテキスト認識していないからです。

于 2013-10-27T13:24:26.573 に答える