web-dev-qa-db-ja.com

langディレクトリなしでURLをデフォルト言語にリダイレクト

これ:example.com/test/example.com/en/test/にリダイレクトする必要がありますが、example.com/es/test/はリダイレクトしません。

この場合、/test/は任意のレベルの任意の数(つまり、/test/succeeded/または/)になります。

.htaccessを備えたApacheサーバーです。

...
RewriteEngine on
RewriteRule . - [E=REWRITEBASE:/]
RewriteRule ^api$ api/ [L]

RewriteRule ^api/(.*)$ %{ENV:REWRITEBASE}webservice/dispatcher.php?url=$1 [QSA,L]

RewriteRule ^images_ie/?([^/]+)\.(jpe?g|png|gif)$ js/jquery/plugins/fancybox/images/$1.$2 [L]
.... 
#At the end of the file I have some redirects:
RedirectMatch 301 ^/es/manufacturer/(.*)$ /es/bodegas/$1
RedirectMatch 301 ^/en/manufacturer/(.*)$ /en/wineries/$1

編集:何人が私が試したことを尋ねました、そして、質問の時に、私の正規表現知識がそれほど悪いので、私は試みませんでした。しかし、応答のおかげで、私はいくつかのことを試しました:

RewriteRule !^(en|es)/(.*)$ /es/$1 [R=302,L] # From the response
RedirectMatch 302 !^/(en|es)/(.*)$ /es/$1 #Tried with a redirectmatch and adding starting / didn't work either
2
gpisw

.htaccessファイルの上部近くでmod_rewriteを使用して、次のようなものを試してください。

RewriteEngine On
RewriteRule !^(en|es)/ /en%{REQUEST_URI} [R=302,L]

これは、/en/または/es/を開始しない要求されたURLに対して、/en/<requested-url>にリダイレクト(302-一時)することを示しています。

(301に変更するだけです-それが必要な場合-それが正常に動作することをテストしたら)

更新:

また、REQUEST_URIがURLの末尾にindex.phpを追加しました。

URLにindex.phpが表示されている場合、最も可能性の高い原因は次のいずれかです。

  • ディレクティブを間違った場所に置きました。ファイルが遅すぎます。既存のrewritesの前に、すべてのredirectsをファイルの先頭近くに移動する必要があります。順序は重要です。
  • 別の(おそらくmod_alias)ディレクティブと競合しています。

    質問を更新したので、mod_rewrite(RewriteRule)とmod_alias(RedirectMatch)の両方からのリダイレクト/書き換えがあります。異なるモジュールは、リクエスト全体で独立して異なる時間に実行されます。 mod_rewriteは、ファイル内の見かけの順序にかかわらず、常に最初に実行されます。これにより、(予期しない)競合が発生する可能性があります。理想的には、代わりにmod_rewrite RewriteRuleを使用するようにすべてのmod_aliasリダイレクトを変換する必要があります(そして、それらが正しい順序であることを確認してください)。

RewriteRule !^(en|es)/(.*)$ /es/$1 [R=302,L] # From the response

キャプチャグループ否定正規表現に含めることができないため、これは期待どおりに機能しません。 $1後方参照は常に空になります。

Aside:また、Apacheはline-endコメントをサポートしません(つまり、ディレクティブの最後に# From the response同じ行に)。このインスタンスでは、Apacheがディレクティブを処理する方法のために正常に動作するようです(有効なディレクティブの後のすべては単純に無視されます)。しかし、3番目の引数(つまり、フラグ[R=302,L])を削除する場合(これはまだ完全に有効です)、500内部サーバーエラーが発生します。これは、Apacheが「コメント」を完全に無効なflags引数として解析しようとするためです。

1
MrWhite