13

サブディレクトリメソッドを使用して複数の言語を許可するように htaccess を設定する際に問題が発生しています。

http://www.domain.com/en/
http://www.domain.com/sw/
http://www.domain.com/ie/

また、複雑なことに、プロジェクトは現在ライブではなく、開発サーバー上にあります。たとえば、現在次のプロジェクトにアクセスしています。

http://dev.domain.com/devname/projectname/

そして、上記が自動的に 301 リダイレクトされるようにしたい:

http://dev.domain.com/devname/projectname/en/

これが私のhtaccessです:

Options +FollowSymLinks -MultiViews
RewriteEngine on

# ----------------------------------------------------------------------
# MULTI LANGUAGE SUB DIRECTORY
# ----------------------------------------------------------------------

RewriteCond %{REQUEST_URI} !^/(en|sw)/
RewriteRule ^(.*)$ en/$1 [R=301,L]

# ----------------------------------------------------------------------
# Rewrite rules
# ----------------------------------------------------------------------

## CASE STUDIES ##
RewriteRule ^casestudies/([^/\.]+).html$ index.php?controller=contents&method=viewCasestudy&link=$1 [L,QSA]

## PRODUCTS ##
RewriteRule ^products/([^/\.]+).html$ index.php?controller=contents&method=viewProduct&link=$1 [L,QSA]

RewriteRule ^([a-z{2}]+)(/)?$ index.php?controller=contents&method=viewHome&lang=$1 [L,QSA] # Default load
RewriteRule ^(/)?$ index.php?controller=contents&method=viewHome [L,QSA] # Default load

上記は実際には次の場所にリダイレクトされます。

http://dev.domain.com/home/webserver_dir/devname/projectname/en/

..そして、RewriteBaseを使用すると、ただ行くようです...

http://dev.domain.com/en/

だから私の質問:開発サーバー上のディレクトリに対して正しく機能する言語 URL を取得するにはどうすればよいですか? そして、環境固有のルールなしでライブになったときに理想的に機能します。

おまけの質問:後続のすべての書き換えルールの前に ([az{2}]+) ビットを追加する必要がありますか?それとも、以降のすべてのルールに影響するすべてをキャッチすることはできますか?

編集 - - - - - - - - - - - - - - -

提案されているように、次のように減らしました...

Options +FollowSymLinks -MultiViews
RewriteEngine on

RewriteBase /devname/projectname/

RewriteCond %{REQUEST_URI} !^/(en|sw)(/|$) [NC]
RewriteRule ^(.*)$ en/$1 [R=301,L]
RewriteRule ^([a-z]{2})/?$ index.php?controller=contents&method=viewHome&lang=$1 [NC,L,QSA] # Default load

...しかし、今は にリダイレクトしていhttp://dev.domain.com/devname/projectname/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/ます。何かアイデアはありますか?

4

2 に答える 2

4

.htaccess を変更してはならない場合

DEVサーバー プロジェクトの<VirtualHost>構成を次のように変更します。

<VirtualHost *:80>
    ServerName dev.domain.com
    ServerAlias project.domain.com
    DocumentRoot "/home/webserver_dir/devname/projectname"
</VirtualHost>

これらの変更は通常、httpd-vhosts.confファイルに含まれます。あなたの.htaccessファイルは今

RewriteBase /

開発サーバーとライブサーバーの両方のベースディレクトリとしてルートをマークします。

プロジェクトのバージョンを変更したり、同じ開発ホストで複数のプロジェクトをテストしたりする場合は、URL パスではなくドメイン名に命名スキームを組み込む必要があります。例えば、

<VirtualHost *:80>
    ServerName dev1.domain.com
    ServerAlias project1.domain.com
    DocumentRoot "/home/webserver_dir/dev1/project1"
</VirtualHost>

<VirtualHost *:80>
    ServerName dev2.domain.com
    ServerAlias project2.domain.com
    DocumentRoot "/home/webserver_dir/dev2/project2"
</VirtualHost>

肝心なのは、ライブに移行すると混乱が追加されるだけのif-elseマンボ ジャンボのmod-rewrite方法に頼らない限り、同じ.htaccessファイル ルールを異なる展開ディレクトリでそのまま使用することはできないということです。

ルールが透過的に機能するためには、Apache はライブ/devX/projectX/になるもの (ディレクトリの後に来るコンテンツ) に関するルールのみを見て適用する必要がありますDocumentRoot

.htaccess への最小限の変更で問題ない場合

すべての人が Apache の.confファイルにアクセスできるわけではありません。特定のホストは、それらを変更する要求を完全に拒否します。そのため、少なくともmod-rewriteを有効にしておくと、多くの Web サイトの設定をいじることができます。RewriteBaseそれらの 1 つは、さまざまな展開ディレクトリを処理するために使用することです。

RewriteBase /そのため、liveを続けてRewriteBase /devX/projectX/for developmentに変更すると、ほとんどの はそのままRewriteRule動作するはずです。したがって、に/devname/projectname/正しくリダイレ​​クトする必要があり/devname/projectname/en/ます。


の使い方([a-z{2}]+)が間違っています。おそらく、([a-z]{2})正確に 2 文字をキャプチャするつもりでした。2体以上捕獲するつもりなら、 になる([a-z]{2,})。したがって、デフォルトのロード書き換えは次のようになります

RewriteRule ^([a-z]{2})/?$ index.php?controller=contents&method=viewHome&lang=$1 [NC,L,QSA] # Default load

後続のすべてのルールでこの正規表現が必要になるか、一致しないと想定するのは正しいことです。したがって、RewriteRuleforcasestudiesは機能しません。言語プレフィックスを気にしない簡単な方法は^、URL パス アンカーの開始を次のように削除することです。

RewriteRule /casestudies/([^/\.]+).html$ index.php?controller=contents&method=viewCasestudy&link=$1 [NC,L,QSA]
RewriteRule /products/([^/\.]+).html$ index.php?controller=contents&method=viewProduct&link=$1 [NC,L,QSA]

上記の言語ディレクトリプレフィックスを持たないすべての URLのリダイレクトを既に行っているため、最後のRewriteRule一致は必要ありません。理想的には^(/)?$301/en/$1

RewriteCond %{REQUEST_URI} !^/(en|sw)(/|$) [NC]
RewriteRule ^(.*)$ en/$1 [R=301,L]

そうしないと、/enにもリダイレクトされます/en/en

于 2013-10-28T15:03:49.563 に答える