質問編集履歴

1

タイトル、内容編集

2020/03/18 05:42

投稿

tomaa
tomaa

スコア84

test CHANGED
@@ -1 +1 @@
1
- PHPのコードで、アクセス元の言語設定とURLの振り分けが、うまくリダイレクトされない
1
+ PHPのコードで、アクセス元の言語設定とURLの振り分けが、うまくリダイレクトされない[他質問に追記しています]
test CHANGED
@@ -1,181 +1,3 @@
1
- ### 提・実現しいこ
1
+ 回の質問と関連するめ、そちらへの追記して内容を載せております。
2
2
 
3
-
4
-
5
- wordpressマルチサイト機能を利用して、2つのwordpressサイトを作っており、それぞれ下記のURLを持っています。
6
-
7
-
8
-
9
- - A:sample.com
10
-
11
- - B:sample.com/en
12
-
13
-
14
-
15
- 最初のアクセスに利用するドメインは、Aのsample.comのみで、
16
-
17
-
18
-
19
- ブラウザの言語設定が
20
-
21
- - 日本語の場合→A:sample.com
22
-
23
- - 日本語以外の場合は全て→B:sample.com/en
24
-
25
-
26
-
27
- へアクセスされるように、functions.phpにコードを追加して対応したいです。
28
-
29
-
30
-
31
- ### 発生している問題・エラーメッセージ
32
-
33
-
34
-
35
- 上記の条件によってアクセスが変わるように、functions.phpにコードを追加すると、ブラウザ(chrome)に下記のエラーがでます。
36
-
37
-
38
-
39
- ```
40
-
41
- This page isn’t working
42
-
43
- sample.com redirected you too many times.
44
-
45
- Try clearing your cookies.
46
-
47
- ERR_TOO_MANY_REDIRECTS
48
-
49
- ```
50
-
51
-
52
-
53
- ### 該当のソースコード
54
-
55
- functions.phpに追加したコードは以下のとおりです。
56
-
57
-
58
-
59
- ```php
60
-
61
- // ユーザーの言語に合わせてリダイレクトする。
62
-
63
- $uri = $_SERVER['REQUEST_URI'];
64
-
65
- $url = get_site_url();
66
-
67
- //無限ループが起こらないようにするために、/と/en/にマッチしないときのみに以下の処理を行う
68
-
69
- if ($uri != '/' || $uri != '/en') {
70
-
71
- $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
72
-
73
- if (isset($languages)) { //languagesが空ではないとき
74
-
75
- $browser_lamguage = $languages[0];
76
-
77
-
78
-
79
- if ($browser_lamguage != 'ja') {
80
-
81
- $url = get_site_url()."/en/";
82
-
83
- }
84
-
85
- }
86
-
87
- header("Location: $url");
88
-
89
- exit();
90
-
91
- }
92
-
93
- ```
94
-
95
-
96
-
97
- ### 試したこと
98
-
99
-
100
-
101
- 下記のサイトのサンプルコードを参考にコードを変えています。
102
-
103
- [ブラウザロケールを判別しlocaleを含むURLにリダイレクトさせ[PHP]](https://hacknote.jp/archives/39939/)
3
+ [アクセス元言語設定によってURLを振り分けるPHPのコードがうまく機能しない](https://teratail.com/questions/247776)
104
-
105
- ```php
106
-
107
- // ユーザーの言語に合わせてリダイレクトする。
108
-
109
- $uri = $_SERVER["REQUEST_URI"];
110
-
111
- $BASE_LANG = "en";
112
-
113
- //無限ループが起こらないようにするために、/ja/や/en/にマッチしないときのみに以下の処理を行う
114
-
115
- if(!preg_match("/^[!-~][a-zA-Z]{2}[!-~]/",$uri)){
116
-
117
- $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
118
-
119
- $lang = $BASE_LANG;
120
-
121
- if(isset($languages)){ //languagesが空ではないとき
122
-
123
- $browser_lamguage = $languages[0];
124
-
125
- $base_languages = array('ja','en');
126
-
127
-
128
-
129
- foreach($base_languages as $base_language){
130
-
131
- if(preg_match("/^$base_language/i", $browser_lamguage)){
132
-
133
- $lang = $base_language;
134
-
135
- break;
136
-
137
- }
138
-
139
- }
140
-
141
- }
142
-
143
- $url = get_site_url()."/$lang/";
144
-
145
- header("Location: $url");
146
-
147
- exit();
148
-
149
- }
150
-
151
- ```
152
-
153
- こちらのコードをそのまま、追加すると
154
-
155
- - 日本語設定でアクセス → sample.com/ja/へ、リダイレクト(404エラーとなる)
156
-
157
- - 英語設定でアクセス → sample.com/en/へ、リダイレクト
158
-
159
-
160
-
161
- となるので、
162
-
163
- - 日本語設定でアクセスした場合のみを → sample.com/へアクセス
164
-
165
- するようにする目的で、該当のソースコードを作成しています。
166
-
167
-
168
-
169
- ### 補足情報(FW/ツールのバージョンなど)
170
-
171
-
172
-
173
- ◆開発環境
174
-
175
- CentOS (7 x86_64)
176
-
177
- Apache (2.4.6 CentOS)
178
-
179
- PHP (7.1.33)
180
-
181
- wordpress(5.2.5)