回答編集履歴

2

複数のリライトルールについて

2018/01/15 17:34

投稿

Tomak
Tomak

スコア1652

test CHANGED
@@ -2,13 +2,15 @@
2
2
 
3
3
 
4
4
 
5
- Apacheの`Rewrite`機能を使えばできます。大き目のプロジェクトではPHPフレームワークを使っているので、最近のPHPフレームワークは初期設定でこのよな設定がきるようになっています。
5
+ > ApacheのRewriteを使う方向考えます。
6
6
 
7
- PHPフレムワークでクエストURLからさらにルーティング機能がありますもっと雑になってい
7
+ 追記で色々勉強させていただいているんですが、固定でクエリ付きPHPにアクセスさせたい場合や/test/somepageのペジからはクエリ文字列を削除など記述は、複数書いいものなのでか?
8
8
 
9
9
 
10
10
 
11
+ 上記をコメントでいただいたので編集しておきます。(全部編集しました)
12
+
11
- リクエストURLの最後の拡張子`.php`を補完したい場合は、ドキュメントルートに下記ようなファイルを`.htaccess`して設置します。(.phpありなし両方アクセス可能になりま
13
+ 複数書いても問題ありません。`RewriteRule ... [L]`こLがルール終了印で、この行まで複数のRewriteRuleを書くこ可能
12
14
 
13
15
 
14
16
 
@@ -26,7 +28,7 @@
26
28
 
27
29
  RewriteCond %{REQUEST_URI} ^(.+)$ #AND リクエストURLをキャプチャー
28
30
 
29
- RewriteRule ^(.*)$ %1.php [L,NC] #リクエストURL.phpにリライトアクセス(URLクエリなし
31
+ RewriteRule ^(.*)$ %1.php [L,NC,NE,QSA] #リクエストURL.phpにリライトアクセス(URLクエリ)
30
32
 
31
33
  </IfModule>
32
34
 
@@ -34,62 +36,86 @@
34
36
 
35
37
 
36
38
 
37
- **== 追記 ==**
38
-
39
- URLクエリイトしたい場合は一番最後の`RewriteRule`を下記のようにします。
39
+ 特定のURLでURLクエリを追加したい場合、削除したい場合は下記のようにします。リダイレクトの上位行のほうが優先度が高いので優先順に上から書いています。それぞれURLをレクトしたい場合は`RewriteRule ... [R=301,L,...]`のように最後に`[R=301]`(恒久的)か、`[R]`(一時的)を追加します。
40
40
 
41
41
 
42
42
 
43
43
  ```apache
44
44
 
45
+ <IfModule mod_rewrite.c>
46
+
47
+ RewriteEngine on
48
+
49
+
50
+
51
+ #特定のURLのみクエリ追加(param=value)
52
+
53
+ RewriteCond %{REQUEST_FILENAME} !-f
54
+
55
+ RewriteCond %{REQUEST_FILENAME} !-d
56
+
57
+ RewriteCond %{REQUEST_FILENAME}.php -f
58
+
59
+ RewriteCond %{REQUEST_URI} ^(/クエリを追加したいURL)$
60
+
61
+ RewriteRule ^(.*)$ $0.php?param=value [L,NC,NE,QSA]
62
+
63
+
64
+
65
+ RewriteCond %{REQUEST_FILENAME} -f
66
+
67
+ RewriteCond %{REQUEST_URI} ^/クエリを追加したいURL.php$
68
+
69
+ RewriteRule ^(.*)$ $0?param=value [L,NC,NE,QSA] [L,NC]
70
+
71
+
72
+
73
+ #特定のURLのみクエリ削除
74
+
75
+ RewriteCond %{REQUEST_FILENAME} !-f
76
+
77
+ RewriteCond %{REQUEST_FILENAME} !-d
78
+
79
+ RewriteCond %{REQUEST_FILENAME}.php -f
80
+
81
+ RewriteCond %{REQUEST_URI} ^(/クエリを削除したいURL)$
82
+
83
+ RewriteRule ^(.*)$ $0.php? [L,NC]
84
+
85
+
86
+
87
+ RewriteCond %{REQUEST_FILENAME} -f
88
+
89
+ RewriteCond %{REQUEST_URI} ^/クエリを削除したいURL.php$
90
+
91
+ RewriteRule ^(.*)$ $0? [L,NC]
92
+
93
+
94
+
95
+ #...
96
+
97
+
98
+
99
+ #拡張子補完、クエリはそのまま
100
+
101
+ RewriteCond %{REQUEST_FILENAME} !-f
102
+
103
+ RewriteCond %{REQUEST_FILENAME} !-d
104
+
105
+ RewriteCond %{REQUEST_FILENAME}.php -f
106
+
107
+ RewriteCond %{REQUEST_URI} ^(.+)$
108
+
45
- RewriteRule ^(.*)$ %1.php [L,NC,NE,QSA]
109
+ RewriteRule ^(.*)$ %1.php [L,NC,NE,QSA]
110
+
111
+ </IfModule>
46
112
 
47
113
  ```
48
114
 
49
115
 
50
116
 
51
- 固定でクエリ付きPHPアクセスさせたい場合は一番最後の`RewriteRule`を下記のます。アクセスURL元のクエも付加することができます。
117
+ 大量ある場合は、サーバーにもりますがリライトマップファイルにまとめたほうが良いです。Root権限ないレンタルサーバーなどではライトマップファイルは作成できないことが多いです。
52
-
53
- `/xxx.php?a=1 → /xxx.php?param=value&a=1`
54
118
 
55
119
 
56
120
 
57
- ```apache
58
-
59
- RewriteRule ^(.*)$ %1.php?param=value [L,NC,NE,QSA]
60
-
61
- ```
62
-
63
-
64
-
65
- その他、`/test/somepage`のページからはクエリ文字列を削除してリダイレクトしたい場合は下記のようにします。
66
-
67
-
68
-
69
- ```apache
70
-
71
- RewriteCond %{REQUEST_URI} ^(/test/somepage)$
72
-
73
- RewriteRule ^(.*)$ %1.php? [R=301,L,NC]
74
-
75
- ```
76
-
77
-
78
-
79
- あと、運用ルールでサーバーサイドに**login.bak, login.20180114**のようなファイルを置かないようにしている場合は、Apacheの`MultiViews`という機能を使えます。ただし、いろいろ危険なのでお勧めはしません。この機能はざっくり言うと拡張子をApacheが保管してくれる機能です。
80
-
81
-
82
-
83
- しかし、例えば同じディレクトリ上に`info.php`と`info.pdf`などが設置されていると、PHPにアクセスできなくなってしまいます。バックアップファイルや、指示書などをサーバーに置いている人も結構いるので危険な可能性があります。
84
-
85
-
86
-
87
- この機能を使いたい場合はドキュメンルートに下記のようファイル`.htaccess`として設置し普通のサーバーはこの機能は初期設定でOFFになってので、ONするだけです。だし、レンタルサーバーなどで変更できない場合もありま
121
+ 運用方法にもよりますがリライでいきりクエリ追加削除する方法はお勧めできせんリンクやロケーションからサーバーサイド入って来た場合、いきり構成が変わってので。新しいシステム構成クエリも移行しなどの目的であれば問題ありませんが
88
-
89
-
90
-
91
- ```apache
92
-
93
- Options +MultiViews
94
-
95
- ```

1

URLクエリ付きリライト設定を追記

2018/01/15 17:34

投稿

Tomak
Tomak

スコア1652

test CHANGED
@@ -1,3 +1,7 @@
1
+ 解決済みになりましたが、URLクエリ付きとコメントでいただいたので追記しておきました。
2
+
3
+
4
+
1
5
  Apacheの`Rewrite`機能を使えばできます。大き目のプロジェクトではPHPフレームワークを使っているので、最近のPHPフレームワークは初期設定でこのような設定ができるようになっています。
2
6
 
3
7
  PHPフレームワークではリクエストURLからさらにルーティング機能がありますので、もっと複雑になっています。
@@ -5,12 +9,6 @@
5
9
 
6
10
 
7
11
  リクエストURLの最後の拡張子`.php`を補完したい場合は、ドキュメントルートに下記のようなファイルを`.htaccess`として設置します。(.phpありなし両方アクセス可能になります)
8
-
9
-
10
-
11
- **※注意**
12
-
13
- URLクエリがある場合はもう少し足さなければなりません。
14
12
 
15
13
 
16
14
 
@@ -28,9 +26,51 @@
28
26
 
29
27
  RewriteCond %{REQUEST_URI} ^(.+)$ #AND リクエストURLをキャプチャー
30
28
 
31
- RewriteRule ^(.*)$ %1.php [L] #リクエストURL.phpにリライトアクセス
29
+ RewriteRule ^(.*)$ %1.php [L,NC] #リクエストURL.phpにリライトアクセス(URLクエリなし)
32
30
 
33
31
  </IfModule>
32
+
33
+ ```
34
+
35
+
36
+
37
+ **== 追記 ==**
38
+
39
+ URLクエリ付きでリライトしたい場合は一番最後の`RewriteRule`を下記のようにします。
40
+
41
+
42
+
43
+ ```apache
44
+
45
+ RewriteRule ^(.*)$ %1.php [L,NC,NE,QSA]
46
+
47
+ ```
48
+
49
+
50
+
51
+ 固定でクエリ付きPHPにアクセスさせたい場合は一番最後の`RewriteRule`を下記のようにします。アクセスURLの元のクエリも付加することができます。
52
+
53
+ `/xxx.php?a=1 → /xxx.php?param=value&a=1`
54
+
55
+
56
+
57
+ ```apache
58
+
59
+ RewriteRule ^(.*)$ %1.php?param=value [L,NC,NE,QSA]
60
+
61
+ ```
62
+
63
+
64
+
65
+ その他、`/test/somepage`のページからはクエリ文字列を削除してリダイレクトしたい場合は下記のようにします。
66
+
67
+
68
+
69
+ ```apache
70
+
71
+ RewriteCond %{REQUEST_URI} ^(/test/somepage)$
72
+
73
+ RewriteRule ^(.*)$ %1.php? [R=301,L,NC]
34
74
 
35
75
  ```
36
76
 
@@ -52,4 +92,4 @@
52
92
 
53
93
  Options +MultiViews
54
94
 
55
- ````
95
+ ```