2016-07-15 20 views
3

私は最近、古いウェブサイトを更新しました。すべての古いページをそれぞれの新しいバージョンに301したいと思います。ここで.htaccess:リダイレクト301とリライタブルとの競合

が私の.htaccess

Options +FollowSymlinks -MultiViews 
RewriteEngine On 

# 
# below are the 301 redirects 
# **rules** 

# 
# below are the RewriteCond 
# **rules** 

# 
# other stuff 
# 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .* - [L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^\.]+?)/?$ $1.php [NC,L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/ 
RewriteRule ^(.+)\.php$ /$1 [R=301,L] 

ある問題は、他の人がちょうどoldfolder/をフォルダです、古いリンクの一部は、拡張子を持つoldfile.htmlを宣言されていることです。

products,products/categoryおよびproducts/category/subcategoryがあります。これらのURLはRewriteCondで生成されます。

次のルールが機能:

Redirect 301 /category/ /products/category 

以下は動作し、代わりにホームページに私をリダイレクトしません。ここ

Redirect 301 /old-folder/subcategory.html /products/category/subcategory 
# /products/category/subcategory is also a RewriteRule 

正確なコードは、私は.htaccessの残りを無視し、これは500 Internal Error

の原因となるので、各Redirect 301[L]フラグを追加しようとした.htaccess

# 301 rule 
Redirect 301 /arredo-urbano/blocchi-standard.html /prodotti/arredo-urbano/001-blocchi-standard 
# RewriteRule 
RewriteRule ^prodotti/([^/]+)/([^/]+)/?$ prodotti.php?category=$1&subcategory=$2 [L] 

でありますすべてのリダイレクトは、正規表現やワイルドカードを使用せずに手動で宣言され、すべて正しく入力されます。

すべてのリダイレクト作業を意図したとおりに行う方法はありますか?また、私が理解していないことは、[L]フラグが内部エラーを引き起こす理由です。

は、一般的にあなたのリダイレクトルールについて

答えて

2

三勧告をありがとう:

  1. 一般的なパターンマッチングのルールの前にルールに一致する特定のパターンをキープ内部書き換えルールの前にルールをリダイレクトしてください
  2. しないでくださいRedirect(mod_alias)のルールをRewriteRule(mod_rewrite)のルールで混ぜてください。

あなたの.htaccessにこれらのルールを試してみてください。

Options +FollowSymlinks -MultiViews 
RewriteEngine On 

RewriteRule ^category/?$ /products/category [L,NC,R=301] 

RewriteRule ^old-folder/subcategory\.html$ /products/category/subcategory [L,NC,R=301] 
# 
# below are the 301 redirects 
# **rules** 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/ 
RewriteRule ^(.+)\.php$ /$1 [R=301,L] 

# 
# below are the RewriteCond 
# **rules** 

# 
# other stuff 
# 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .* - [L] 

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+?)/?$ $1.php [L] 

この変更をテストする前にブラウザのキャッシュをクリアすることを確認します。

+0

ありがとう、これは動作しているようです。私はすべてのルールを手動で変更する必要があります。ちょうど質問:これはリダイレクトと同じですか?代わりにRewriteRuleを使うことはできますか?私は古いウェブサイトが非常に良いランクを持っていて、それを失いたくないので、これは主にSEOのためにやっています。 –

+1

はい 'R = 301 'の' RewriteRule'は 'Redirect'と同じですが、より多くの機能があります – anubhava

関連する問題