0

ユーザー/検索エンジンに適したURLに書き直してから、元のURLを新しいURLに301リダイレクトしようとしています。

現時点では、投稿は次のように生成されます:example.com/blog/post.php?s=nice-post

しかし、私はそれらを次のように見せてほしい:example.com/blog/nice-post

これが私がこれまでに得たものです:

RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteCond %{QUERY_STRING} ^s=(.+)$
RewriteRule post.php /%1? [R=301,L]

RewriteCond %{REQUEST_URI} !post.php
RewriteRule ^([a-zA-Z0-9_-]+)$ post.php?s=$1

残念ながら、これは404リダイレクトと衝突し、見つからないすべてのページを空白のpost.phpファイルに送信します。その理由を理解できません。URLの書き換え/リダイレクトにアプローチするためのより良い方法はありますか?

見てくれてありがとう:)

4

2 に答える 2

1

header() に関する tdammers の提案の詳細

post.php で、何かを出力する前に、それが有効な投稿であるかどうかを判断します (たとえば、データベースで ID を調べることによって)。

if( !$valid ) {
    header( 'HTTP/1.0 404 Not Found' );
    echo "404";
    exit;
}

つまり、ページが無効であることが判明した場合、PHP は 404 ヘッダーをブラウザーに送信して、これが見つからないページであることを通知します。残念ながら、Apache のデフォルトの 404 ページにリダイレクトする簡単な方法はないため、自分で何かを出力する必要がありますが、カスタム 404 ページが既にあるので、それを include() するだけでかまいません。

于 2012-08-27T00:26:33.427 に答える
0

ディレクトリのhtaccessファイルにこれらのルールがあると仮定します/blog/RewriteBaseクエリ文字列の後方参照に先頭のスラッシュを追加して削除してみてください。

RewriteEngine On

RewriteBase /blog/

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteCond %{QUERY_STRING} ^s=(.+)$
RewriteRule post.php %1? [R=301,L]

RewriteCond %{REQUEST_URI} !post.php
RewriteRule ^([a-zA-Z0-9_-]+)$ post.php?s=$1
于 2012-08-26T17:41:23.293 に答える