0

私の.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^-([0-9]+) /simpleblog/index.php?post_id=$1

これは、リンクがどのようにフォーマットされているかです。

<a href = "index.php?post_id=<?php echo $post['posts_id']; ?>-<?php echo $post['title']; ?>"><?php echo $post['title'];?></a>

現在、リンクは次のようになっています。

http://localhost/simpleblog/index.php?post_id=15-First%20Post

リンクを次のようにしたい:

http://localhost/simpleblog/post/First-Post

私は.htaccessを使って新しい. 正しい使い方がわかりません。では、リンクを希望どおりにするにはどうすればよいですか?

4

3 に答える 3

1

あなたが実装しようとしているように物事はうまくいきません:

Web ブラウザーで表示する URL には、数値 ID が記載されていません。その URL を構文レベルで必要なものに書き換えることは確かに可能です。しかし、書き換えモジュールが、そのタイトルの投稿の ID が 15 であると推測する方法はありません。

したがって、公開する URL の一部として数値 ID を受け入れるか、英数字のタイトルで投稿を参照できるルーチンを実装する必要があります。ただし、投稿のタイトルには、そのような英数字の参照内にあらゆる種類の特殊文字などが含まれている可能性があることを考慮すると、エラーが発生しやすくなります。これが、ほとんどのサイトが数字の ID と英数字のタイトルの両方を組み合わせて使用​​する理由です。タイトルは書き換えモジュールによって静かに削除されますが、数値 ID は投稿を参照するために内部で使用されるものです。

于 2013-01-20T10:13:39.450 に答える
1

あなたの例のパラメーターに関する私の質問に対するあなたのコメントによると15、私の結論は、post/First-PostURL セグメントは実際にはこの回答で呼び出される 3 つの異なるパラメーターを保持しているというpar1ことpar3です。

それが正しければ、これを試すことができます:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} .*/([^/]+)/([^-]+)-([^/]+)/?  [NC]
RewriteRule .*  simpleblog/index.php?post_id=%1-%2_%3   [L]

サイレント マップ

http://localhost/simpleblog/par1/par2-par3(これはブラウザのバーに入力された URL です)

http://localhost/simpleblog/index.php?post_id=par1-par2_par3

あなたの質問では、par2 と par3 の間にスペース (%20) があり、リダイレクトされたクエリで_問題を回避するために置き換えられます。

スペースがどうしても必要な場合は、次のindex.phpようなコードで変換を行います。

<?php  
if (isset ($_GET['post_id']) ) {
$PostId = $_GET['post_id'] ; 
$PostId = str_replace('_',' ',$PostId);
echo $PostId . "<br /><br />";  // Test
}
?>
于 2013-01-21T03:36:16.093 に答える
0

SEF (Search Engine Friendly) の URL を作成しようとしています。最適な方法は、データベースにテーブルを作成することだと思います。

sef_urls(original_url,sef_url) 

元の URL (index.php?post_id=15-First%20Post) と必要な sef URL (post/First-Post) を保存する場所を .htaccess に保存します。

RewriteRule ^(.*)$ index.php [F,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

そして、index.php で、元の URL を知るために db テーブルにクエリを実行します。たとえば、次のように書きます。

localhost/simpleblog/post/First-Post

index.php は次のことを行います。

$requested_url="..";
$result=mysql_query("SELECT original_url FROM sef_urls WHERE sef_url=$requested_url");
if($row=mysql_fetch_array($result)){//is this SEF url a known url?
   include($row['original_url'];
}else{
   //404 not found
}
于 2013-01-20T10:27:44.263 に答える