teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

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

2018/01/15 17:34

投稿

Tomak
Tomak

スコア1652

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

1

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

2018/01/15 17:34

投稿

Tomak
Tomak

スコア1652

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] #リクエストURL.phpにリライトアクセス
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
+ ```