回答編集履歴
2
複数のリライトルールについて
answer
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
解決済みになりましたが、URLクエリ付きとコメントでいただいたので追記しておきました。
|
2
2
|
|
3
|
+
> ApacheのRewriteを使う方向で考えます。
|
3
|
-
|
4
|
+
追記で色々勉強させていただいているんですが、固定でクエリ付きPHPにアクセスさせたい場合や/test/somepageのページからはクエリ文字列を削除などの記述は、複数書いてもいいものなのですか?
|
4
|
-
PHPフレームワークではリクエストURLからさらにルーティング機能がありますので、もっと複雑になっています。
|
5
5
|
|
6
|
+
上記をコメントでいただいたので編集しておきます。(全部編集しました)
|
6
|
-
|
7
|
+
複数書いても問題ありません。`RewriteRule ... [L]`このLがルール終了の印で、この行まで複数のRewriteRuleを書くことも可能です。
|
7
8
|
|
8
9
|
```apache
|
9
10
|
<IfModule mod_rewrite.c>
|
@@ -12,37 +13,49 @@
|
|
12
13
|
RewriteCond %{REQUEST_FILENAME} !-d #AND ディレクトリパスが見つからない
|
13
14
|
RewriteCond %{REQUEST_FILENAME}.php -f #AND ファイルパス.phpが見つかった
|
14
15
|
RewriteCond %{REQUEST_URI} ^(.+)$ #AND リクエストURLをキャプチャー
|
15
|
-
RewriteRule ^(.*)$ %1.php [L,NC]
|
16
|
+
RewriteRule ^(.*)$ %1.php [L,NC,NE,QSA] #リクエストURL.phpにリライトアクセス(URLクエリ)
|
16
17
|
</IfModule>
|
17
18
|
```
|
18
19
|
|
19
|
-
**== 追記 ==**
|
20
|
-
URLクエリ
|
20
|
+
特定のURLでURLクエリを追加したい場合、削除したい場合は下記のようにします。リダイレクトの上位行のほうが優先度が高いので優先順に上から書いていきます。それぞれURLをリダイレクトしたい場合は、`RewriteRule ... [R=301,L,...]`のように最後に`[R=301]`(恒久的)か、`[R]`(一時的)を追加します。
|
21
21
|
|
22
22
|
```apache
|
23
|
-
|
23
|
+
<IfModule mod_rewrite.c>
|
24
|
-
|
24
|
+
RewriteEngine on
|
25
25
|
|
26
|
+
#特定のURLのみクエリ追加(param=value)
|
27
|
+
RewriteCond %{REQUEST_FILENAME} !-f
|
28
|
+
RewriteCond %{REQUEST_FILENAME} !-d
|
29
|
+
RewriteCond %{REQUEST_FILENAME}.php -f
|
26
|
-
|
30
|
+
RewriteCond %{REQUEST_URI} ^(/クエリを追加したいURL)$
|
27
|
-
|
31
|
+
RewriteRule ^(.*)$ $0.php?param=value [L,NC,NE,QSA]
|
28
32
|
|
29
|
-
|
33
|
+
RewriteCond %{REQUEST_FILENAME} -f
|
34
|
+
RewriteCond %{REQUEST_URI} ^/クエリを追加したいURL.php$
|
30
|
-
RewriteRule ^(.*)$
|
35
|
+
RewriteRule ^(.*)$ $0?param=value [L,NC,NE,QSA] [L,NC]
|
31
|
-
```
|
32
36
|
|
37
|
+
#特定のURLのみクエリ削除
|
38
|
+
RewriteCond %{REQUEST_FILENAME} !-f
|
39
|
+
RewriteCond %{REQUEST_FILENAME} !-d
|
40
|
+
RewriteCond %{REQUEST_FILENAME}.php -f
|
33
|
-
|
41
|
+
RewriteCond %{REQUEST_URI} ^(/クエリを削除したいURL)$
|
42
|
+
RewriteRule ^(.*)$ $0.php? [L,NC]
|
34
43
|
|
35
|
-
|
44
|
+
RewriteCond %{REQUEST_FILENAME} -f
|
36
|
-
RewriteCond %{REQUEST_URI} ^
|
45
|
+
RewriteCond %{REQUEST_URI} ^/クエリを削除したいURL.php$
|
37
|
-
RewriteRule ^(.*)$
|
46
|
+
RewriteRule ^(.*)$ $0? [L,NC]
|
38
|
-
```
|
39
47
|
|
40
|
-
|
48
|
+
#...
|
41
49
|
|
50
|
+
#拡張子補完、クエリはそのまま
|
51
|
+
RewriteCond %{REQUEST_FILENAME} !-f
|
52
|
+
RewriteCond %{REQUEST_FILENAME} !-d
|
53
|
+
RewriteCond %{REQUEST_FILENAME}.php -f
|
54
|
+
RewriteCond %{REQUEST_URI} ^(.+)$
|
42
|
-
|
55
|
+
RewriteRule ^(.*)$ %1.php [L,NC,NE,QSA]
|
56
|
+
</IfModule>
|
57
|
+
```
|
43
58
|
|
44
|
-
|
59
|
+
大量にある場合は、サーバーにもよりますがリライトマップファイルにまとめたほうが良いです。Root権限のないレンタルサーバーなどではリライトマップファイルは作成できないことが多いです。
|
45
60
|
|
46
|
-
```apache
|
47
|
-
|
61
|
+
運用方法にもよりますが、リライトでいきなりクエリを追加削除する方法はお勧めできません。元のリンクやロケーションからサーバーサイドに入って来た場合、いきなり構成が変わってしまうので。新しいシステム構成にクエリも移行したいなどの目的であれば問題ありませんが。
|
48
|
-
```
|
1
URLクエリ付きリライト設定を追記
answer
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
+
解決済みになりましたが、URLクエリ付きとコメントでいただいたので追記しておきました。
|
2
|
+
|
1
3
|
Apacheの`Rewrite`機能を使えばできます。大き目のプロジェクトではPHPフレームワークを使っているので、最近のPHPフレームワークは初期設定でこのような設定ができるようになっています。
|
2
4
|
PHPフレームワークではリクエストURLからさらにルーティング機能がありますので、もっと複雑になっています。
|
3
5
|
|
4
6
|
リクエストURLの最後の拡張子`.php`を補完したい場合は、ドキュメントルートに下記のようなファイルを`.htaccess`として設置します。(.phpありなし両方アクセス可能になります)
|
5
7
|
|
6
|
-
**※注意**
|
7
|
-
URLクエリがある場合はもう少し足さなければなりません。
|
8
|
-
|
9
8
|
```apache
|
10
9
|
<IfModule mod_rewrite.c>
|
11
10
|
RewriteEngine on
|
@@ -13,10 +12,31 @@
|
|
13
12
|
RewriteCond %{REQUEST_FILENAME} !-d #AND ディレクトリパスが見つからない
|
14
13
|
RewriteCond %{REQUEST_FILENAME}.php -f #AND ファイルパス.phpが見つかった
|
15
14
|
RewriteCond %{REQUEST_URI} ^(.+)$ #AND リクエストURLをキャプチャー
|
16
|
-
RewriteRule ^(.*)$ %1.php [L]
|
15
|
+
RewriteRule ^(.*)$ %1.php [L,NC] #リクエストURL.phpにリライトアクセス(URLクエリなし)
|
17
16
|
</IfModule>
|
18
17
|
```
|
19
18
|
|
19
|
+
**== 追記 ==**
|
20
|
+
URLクエリ付きでリライトしたい場合は一番最後の`RewriteRule`を下記のようにします。
|
21
|
+
|
22
|
+
```apache
|
23
|
+
RewriteRule ^(.*)$ %1.php [L,NC,NE,QSA]
|
24
|
+
```
|
25
|
+
|
26
|
+
固定でクエリ付きPHPにアクセスさせたい場合は一番最後の`RewriteRule`を下記のようにします。アクセスURLの元のクエリも付加することができます。
|
27
|
+
`/xxx.php?a=1 → /xxx.php?param=value&a=1`
|
28
|
+
|
29
|
+
```apache
|
30
|
+
RewriteRule ^(.*)$ %1.php?param=value [L,NC,NE,QSA]
|
31
|
+
```
|
32
|
+
|
33
|
+
その他、`/test/somepage`のページからはクエリ文字列を削除してリダイレクトしたい場合は下記のようにします。
|
34
|
+
|
35
|
+
```apache
|
36
|
+
RewriteCond %{REQUEST_URI} ^(/test/somepage)$
|
37
|
+
RewriteRule ^(.*)$ %1.php? [R=301,L,NC]
|
38
|
+
```
|
39
|
+
|
20
40
|
あと、運用ルールでサーバーサイドに**login.bak, login.20180114**のようなファイルを置かないようにしている場合は、Apacheの`MultiViews`という機能を使えます。ただし、いろいろ危険なのでお勧めはしません。この機能はざっくり言うと拡張子をApacheが保管してくれる機能です。
|
21
41
|
|
22
42
|
しかし、例えば同じディレクトリ上に`info.php`と`info.pdf`などが設置されていると、PHPにアクセスできなくなってしまいます。バックアップファイルや、指示書などをサーバーに置いている人も結構いるので危険な可能性があります。
|
@@ -25,4 +45,4 @@
|
|
25
45
|
|
26
46
|
```apache
|
27
47
|
Options +MultiViews
|
28
|
-
```
|
48
|
+
```
|