ConoHa(CentOS6.5)にxdebug入れる
# yum install php-pecl-xdebug Loaded plugins: fastestmirror, priorities, security Setting up Install Process Loading mirror speeds from cached hostfile * base: ftp.tsukuba.wide.ad.jp * epel: ftp.kddilabs.jp * extras: ftp.tsukuba.wide.ad.jp * updates: ftp.tsukuba.wide.ad.jp 148 packages excluded due to repository priority protections Resolving Dependencies --> Running transaction check ---> Package php-pecl-xdebug.x86_64 0:2.1.4-1.el6 will be installed --> Processing Dependency: php(zend-abi) = 20090626 for package: php-pecl-xdebug-2.1.4-1.el6.x86_64 --> Processing Dependency: php(api) = 20090626 for package: php-pecl-xdebug-2.1.4-1.el6.x86_64 --> Finished Dependency Resolution Error: Package: php-pecl-xdebug-2.1.4-1.el6.x86_64 (epel) Requires: php(zend-abi) = 20090626 Installed: php-common-5.5.18-1.el6.remi.x86_64 (@remi-php55) php(zend-abi) = 20121212-64 Available: php-common-5.3.3-38.el6.x86_64 (base) php(zend-abi) = 20090626 Available: php-common-5.3.3-40.el6_6.x86_64 (updates) php(zend-abi) = 20090626 Error: Package: php-pecl-xdebug-2.1.4-1.el6.x86_64 (epel) Requires: php(api) = 20090626 Installed: php-common-5.5.18-1.el6.remi.x86_64 (@remi-php55) php(api) = 20121113-64 Available: php-common-5.3.3-38.el6.x86_64 (base) php(api) = 20090626 Available: php-common-5.3.3-40.el6_6.x86_64 (updates) php(api) = 20090626 You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles --nodigest
baseから入れようとするとエラー出るので、php5.5入れたとき同様remi-php55から入れる。
# yum -y install php-pecl-xdebug --enablerepo=remi-php55 Loaded plugins: fastestmirror, priorities, security Setting up Install Process Loading mirror speeds from cached hostfile * base: ftp.tsukuba.wide.ad.jp * epel: ftp.tsukuba.wide.ad.jp * extras: ftp.tsukuba.wide.ad.jp * remi-php55: remi.kazukioishi.net * updates: ftp.tsukuba.wide.ad.jp 285 packages excluded due to repository priority protections Resolving Dependencies --> Running transaction check ---> Package php-pecl-xdebug.x86_64 0:2.2.5-1.el6.remi.5.5 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================================================================== Package Arch Version Repository Size ================================================================================================================================== Installing: php-pecl-xdebug x86_64 2.2.5-1.el6.remi.5.5 remi-php55 164 k Transaction Summary ================================================================================================================================== Install 1 Package(s) Total download size: 164 k Installed size: 560 k Downloading Packages: php-pecl-xdebug-2.2.5-1.el6.remi.5.5.x86_64.rpm | 164 kB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : php-pecl-xdebug-2.2.5-1.el6.remi.5.5.x86_64 1/1 Verifying : php-pecl-xdebug-2.2.5-1.el6.remi.5.5.x86_64 1/1 Installed: php-pecl-xdebug.x86_64 0:2.2.5-1.el6.remi.5.5 Complete!
$ php -v PHP 5.5.18 (cli) (built: Oct 16 2014 12:21:51) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans
ConoHaで環境構築③
remiリポジトリの追加
$ sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm $ sudo yum install yum-plugin-priorities ← リポジトリの優先順位を変更できるyum-plugin-prioritiesをインストール $ sudo vim /etc/yum.repos.d/CentOS-Base.repo ← 全てのリポジトリに`priority=2`を指定 $ sudo vim /etc/yum.repos.d/remi.repo ← 全てのリポジトリに`priority=1`を指定
Apache
ConoHaではデフォルトでApacheが入っているので、有効化するだけ。
$ sudo service httpd start $ sudo chkconfig httpd on $ sudo vim /var/www/html/index.html ← 表示確認用に適当に何か作ってみる。
ブラウザからアクセスして正常に表示されればOK。
続いてApacheのセキュリティ関連の設定を行う。
$ sudo vim /etc/httpd/conf/httpd.conf ServerSignature Off ← エラー画面にサーバ情報を表示しない。 ServerTokens ProductOnly ← レスポンスヘッダーにサーバ情報を出力しない。 Header always append X-Frame-Options DENY ← 最終行あたりに追加。クリックジャッキング対策。 TraceEnable Off ← 最終行あたりに追加。Traceメソッドを無効化。 $ sudo service httpd restart
またhttpd.confでは、Options hoge Indexes
のようにIndexesがあるとファイル一覧がブラウザで出力されてしまうので、Indexesというキーワードは全て削除する。
参考
Apache のバージョンや OS の情報を出力しないようにする
Apache のディレクトリリスティングを無効にする
クリックジャッキング対策(Apache/IIS)
Apache の Trace メソッドを無効にする
MySQL
$ sudo yum -y install mysql-server $ sudo service mysqld start $ sudo chkconfig mysqld on $ mysqladmin -u root password パスワード ← MySQLのrootパスワードを設定する。
phpMyAdmin
phpMyAdminのインストールにはphp-gdとImageMagick-lastが必要なので、先にそちらをインストールしておく。
$ sudo yum -y install --enablerepo=remi gd-last // php-gd入れるのに必要 $ sudo yum -y install --enablerepo=remi-php55 php-gd $ sudo yum -y install --enablerepo=remi ImageMagick-last $ sudo yum -y install --enablerepo=remi-php55 phpMyAdmin
アクセス制限を切ってBASIC認証をかける。
$ sudo vim /etc/httpd/conf.d/phpMyAdmin.conf <Directory /usr/share/phpMyAdmin/> <IfModule mod_authz_core.c> # Apache 2.4 Require local </IfModule> <IfModule !mod_authz_core.c> # Apache 2.2 #Order Deny,Allow #Deny from All #Allow from 127.0.0.1 #Allow from ::1 </IfModule> </Directory> <Directory /usr/share/phpMyAdmin/setup/> <IfModule mod_authz_core.c> # Apache 2.4 Require local </IfModule> <IfModule !mod_authz_core.c> # Apache 2.2 #Order Deny,Allow #Deny from All #Allow from 127.0.0.1 #Allow from ::1 </IfModule> </Directory>
$ sudo htpasswd -c /usr/share/phpMyAdmin/.htpasswd ユーザ名 New password: Re-type new password: Adding password for user hoge
$ sudo vim /usr/share/phpMyAdmin/.htaccess AuthUserFile /usr/share/phpMyAdmin/.htpasswd AuthGroupFile /dev/null AuthName "Secret" AuthType Basic require valid-user <Files ~ "^.(htpasswd|htaccess)$"> deny from all </Files>
デフォルトではhtaccessが有効になっていないので、設定で有効にする。
$ sudo vim /etc/httpd/conf/httpd.conf <Directory /> Options FollowSymLinks AllowOverride All ← NoneからAllに変更 </Directory> $ sudo service httpd restart
参考:CentOSにPHP5.5とphpMyAdminをインストール
PHP
PHPはデフォルトで5.3.3が入っている。
PHP5.5を使いたいのでremi-php55リポジトリを使ってyum update
する。
$ sudo yum -y update --enablerepo=remi,remi-php55
だいたいこんなところか…
本格的に使いはじめるならこれに加えて独自ドメインの設定とかしないとあかんね。
今度はchefとかプロビジョニングツール使ってみたい。
ConoHaで環境構築②
iptablesの設定
sshポートはあとで10022に変更します。
$ chkconfig iptables --list ← 3:onになっているのを確認 $ sudo vim /etc/sysconfig/iptables *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT ← 念のため許可しておく。sshポート変更して10022で接続できたら削除。 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited COMMIT $ sudo service iptables restart
ip6tablesの設定
$ chkconfig ip6tables --list ← 有効になってるか確認 $ sudo vim /etc/sysconfig/ip6tables *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 546 --sport 547 -s fe80::/10 -d fe80::/10 -j ACCEPT -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited -A FORWARD -j REJECT --reject-with icmp6-adm-prohibited COMMIT $ sudo service ip6tables restart
参考:ConoHa での Nginx + WordPress CentOSでの環境構築メモ
SSHのポート番号を変更
# vim /etc/ssh/sshd_config Port 10022 ← コメントアウト解除して22から10022に変更 # service sshd restart
10022ポートでSSH接続できるのを確認したら、iptables設定の22ポート許可設定を削除する。(削除後のiptablesリスタート忘れずに)
ntpの設定
$ chkconfig ntpd --list ← 有効になってるか確認 $ sudo vim /etc/ntp.conf #server 0.centos.pool.ntp.org iburst ← デフォルト設定をコメントアウトしてntp.nict.jpを新しく追加 #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst server -4 ntp.nict.jp server -4 ntp1.jst.mfeed.ad.jp server -4 ntp2.jst.mfeed.ad.jp server -4 ntp3.jst.mfeed.ad.jp $ sudo service ntpd restart
nkfとjumanのインストール
開発しているシステムで使うので。
$ sudo yum -y install nkf
jumanはここからVer.6.0をダウンロードしてWinSCPで/home/tmysz/usr/local/src/juman
に転送。
$ cd /home/tmysz/usr/local/src/juman $ tar xvzf juman-6.01.tar.gz $ ./configure --prefix=/home/tmysz/usr/local ← prefixでインストール場所を指定。デフォルトでは/usr/local。成功すればMakefileが生成される。 $ make $ make install ← /home/tmysz/usr/local/binにインストールされる。 $ cd /home/tmysz/usr/local/bin $ ./juman -v juman 6.01
パスが通っていないので、/home/tmysz/usr/local/bin
にパスを通す。
$ cd ~/ $ vim .bash_profile PATH=$PATH:$HOME/bin:$HOME/usr/local/bin ← :$HOME/usr/local/binを追加 export PATH
再ログインしてパスが通っているのを確認。
追記:全ユーザで使いたいので、~/.bash_profile
に書いたの削除して/etc/profile
に書き直した。
$ sudo vim /etc/profile PATH=$PATH:/home/tmysz/usr/local/bin export PATH
ConoHaで環境構築①
ConoHa試用中です。
ConoHaでは、SSH経由シリアルコンソール接続するための秘密鍵が用意されているので、それをConoHaコンパネからダウンロードしてシリアルコンソールに接続する。 あくまでシリアルコンソール接続のための秘密鍵なので注意。 SSH接続用に使う公開鍵・秘密鍵は以下作業の中で自分で作ります。
作業ユーザの作成
# useradd tmysz # passwd tmysz
wheelグループのみrootになれるようにする
# vim /etc/pam.d/su auth required pam_wheel.so use_uid ← コメントアウト解除 # vim /etc/login.defs SU_WHEEL_ONLY yes ← 追加 # visudo %wheel ALL=(ALL) ALL ← コメントアウト解除。sudoの度にパスワード要求する。
作成した作業ユーザをwheelグループに追加する
# usermod -G wheel tmysz
以降の作業は作業ユーザでログインしなおして行う。
公開鍵認証の準備
$ ssh-keygen -t rsa -b 2048 Generating public/private rsa key pair. Enter file in which to save the key (/home/tmysz/.ssh/id_rsa): ← キーを保存する場所。今回はデフォルトのまま。 Enter passphrase (empty for no passphrase): ← キーフレーズ入力 Enter same passphrase again: ← キーフレーズ再入力 Your identification has been saved in /home/tmysz/.ssh/id_rsa. Your public key has been saved in /home/tmysz/.ssh/id_rsa.pub. The key fingerprint is: The key's randomart image is: $ mv /home/tmysz/.ssh/id_rsa.pub /home/tmysz/.ssh/authorized_keys ← 公開鍵のファイル名を変更 $ sudo vim /etc/ssh/sshd_config PubkeyAuthentication yes ← コメントアウト解除 $ sudo service sshd restart
生成された秘密鍵をローカルに(セキュアな方法で)ダウンロードして使う。(Windows+TeraTerm使うのでPuttygenで変換)
rootでSSHログイン出来ないようにする&パスワード認証無効化
$ sudo vim /etc/ssh/sshd_config PermitRootLogin no ← コメントアウト解除 PasswordAuthentication no ← ConoHaではデフォルトでno $ sudo service sshd restart
sshdリスタート後にrootでsshログインできなくなっていることを確認&作業ユーザでsshログイン出来る事を確認。
パッケージのアップデート
$ sudo yum -y update
Sublime text3に入れてるパッケージとか設定とか
前にも同じような記事を書きましたが、転職して職場環境も開発環境も新しくリフレッシュしたのでSublime textのパッケージも今一度見直してみることにしました。
パッケージの内容は前回の記事とほぼほぼ同じだと思いますが、今回はそれに加えて現在の設定ファイルの記述も備忘録として残しておこうと思います。
Package Control: List Packages
AutoFileName
ファイル名などを自動補完。
BracketHighlighter
タグの開始終了をハイライト。
CSS Snippets
DocBlockr
関数のコメントを自動生成。
ConvertToUTF8
2014/10/18 追記
すごい重要なパッケージ書き忘れてました。
Sublime textはShiftJISやEUCといった日本語文字コードファイルに対応しておらず、ファイルを開くと文字化けしてしまいます。
ConvertToUTF8は、ShiftJISやEUCのファイルを開くときにUTF8に自動変換することで文字化けを回避することが出来ます。
編集が終わって保存するときはまたShiftJISやEUCに自動変換してくれます。
業務ではいまだにShiftJISやEUCのファイルを扱うことが少なくないので、仕事する上では必須のパッケージになってます。
Emmet
Zen-Codingの後見。
GotoDocumentation
PHPの関数の上でF1(キーバインドで設定)押すとphp.netの該当ページに飛ぶ。
HTML5
HTML5の自動補完。
IMESupport
日本語のインライン入力サポート。
JS Snippets
JSのスニペット集。ほとんどJS書かないけど。
MarkdownEditing
Markdownのハイライト表示。
OmniMarkupPreviewer
Markdownをブラウザでプレビュー。
Package Control
パッケージの管理をしてくれる必須パッケージ。Sublime textインストールした後に最初に入れるもの。
パッケージのインストール・削除・有効無効化もPackageControlから行う。
ここから3or2のコードをコピペしてSublime textでCtrl+`押して(若しくはView→Show Console)貼り付ければインストールできる。
SFTP
名前の通りSFTPでファイルアップロード・ダウンロード・比較できる。
ライセンス購入済み。
SideBarEnhancements
サイドバーメニュー拡張。
Sublime Tweet
Sublime textからツイートできるようになる。
ネタで入れたけど実際ほぼ使ってない。
SublimeCodeIntel
自作関数・変数・定数にカーソルを置いた状態でCtrl+Win+Alt+↑(Windowsの場合)で宣言元にジャンプする。
Ctrl+Win+Alt+←で元の場所に戻る。
Sublime text3から新機能としてGotoDefinitionという同じようなことができる機能が標準で実装されていますが、GotoDefinitionは変数や定数には対応していないので専らSublimeCodeIntelの方を使っています。
SublimeLinter
構文エラーをリアルタイムでチェックして表示する。
これ単体ではエラーを表示する機能しか持っていないため、言語ごとにLinterパッケージを入れる必要があります。
SublimeLinter-php
PHPの構文エラーをリアルタイムでチェックする。
PCにPHPがインストールされていて且つパスが通っている必要がある。XAMPPのPHPをそのまま使ってます。
ちなみにPackageControlでSublimeLinter-phpを検索すると似たような名前のパッケージがいくつか出てきます。
- SublimeLinter-php
PHPの構文エラーを指摘してくれる。PHPのインストールが必要。 - SublimeLinter-phpcs
PSR2などのコーディング規約に違反している箇所をチェックしてくれる。PHPCSのインストールが必要。 - SublimeLinter-phplint
詳しくはわからないけどPHPソースのバリデーター。PHPLintのインストールが必要。 - SublimeLinter-phpmd
不必要な変数宣言や長すぎる名前・行を指摘してくれる。PHPMDのインストールが必要。
参考
WindowsでPHPMDやPHPCSを入れてSublimeLinterでLintする - MANA-DOT
Sublimerge Pro
差分比較。
Theme - Flatland
itg.flatから乗り換え。
Preferences: Settings - User
{ "theme": "Flatland Dark.sublime-theme", "color_scheme": "Packages/User/Flatland Monokai (SL).tmTheme", "flatland_square_tabs": false, // テーマの設定。タブをスクエア表示しない。 "enable_tab_scrolling": false, // タブのスクロール表示しない "font_size": 10, // フォントサイズ "tab_size": 4, // タブのスペース文字数 "translate_tabs_to_spaces": true, // タブをスペースに変換 "show_encoding": true, // 文字コードをステータスバーに表示 "show_line_endings": true, // 改行コードをステータスバーに表示 "default_encoding": "UTF-8", // デフォルト文字コード "fallback_encoding": "Shift-JIS", // 文字コード判別できない場合の指定エンコード "default_line_ending": "unix", // デフォルト改行コード(windows=CRLF, unix=LF) "highlight_line": true, // カーソルがある行をハイライト表示 "highlight_modified_tabs": true, // 未保存のタブをハイライト表示 "draw_minimap_border": true, // ミニマップの現在位置をボーダーで囲む "close_windows_when_empty": false, // タブ全部閉じてもウィンドウ閉じないようにする }
Preferences: Key Bindings - User
[ { "keys": ["ctrl+shift+t"], "command": "tweet" }, { "keys": ["ctrl+shift+c"], "command": "read_tweets" }, { "keys": ["ctrl+alt+u"], "command": "sftp_upload_file" }, { "keys": ["f1"], "command": "goto_documentation" }, { "keys": ["f12"], "command": "goto_definition" }, { "keys": ["alt+left"], "command": "jump_back" }, { "keys": ["alt+right"], "command": "jump_forward" }, ]
Gitの用語メモ
普段の業務ではSVNでソース管理しているのですが、最近個人的な開発(と呼べるほどのことはしていませんが)でBitbucket/SourceTreeを使って今更ながらGitを触り始めました。
SVNを使っていたと言っても基本的にはチェックアウト・更新・コミットをするくらいで、掘り下げた使い方はあまりしたことがありません。
そんなこんなでGitを使い始めたところ、新しい用語や概念が出てきて混乱したので、使う上で最低限の用語をメモしておきました。
うまくまとまってないし用語解釈がおかしいところがあると思う…
概念的な用語
リモートリポジトリ
みんなが使う共有リポジトリ。
ローカルリポジトリ
自分専用のリポジトリ。
インデックス
変更したファイルをローカルリポジトリにコミットするために、まずはインデックスに追加する必要がある。
実作業で使う用語
クローン
既存のリモートリポジトリからローカルにプロジェクトをコピーしてくる。(作業ディレクトリの作成)
コミット
インデックスに追加された変更ファイルをローカルリポジトリに反映する。
チェックアウト
作業するブランチを切り替える。チェックアウト後のコミットは切り替えたブランチに対して行われる。
追加
作業ディレクトリの変更ファイルをインデックスに登録する。SVNの追加と同じ感じ。
削除
インデックスに登録した変更ファイルをインデックスから削除する。SVNの追加の取り消しと同じ感じ。
フェッチ
リモートリポジトリの変更を取ってくる。マージはされない。 勝手にマージされると困るときはプルじゃなくてフェッチして手動でマージするといった使い方かな?よく分からない。
プル
リモートリポジトリの変更をローカルリポジトリにマージして反映する。SVNでいうと更新みたいな感じ。
プッシュ
ブランチ
SVNのブランチと同じようなものだと思うけどよく分からない。 初コミット時にはmasterブランチが作成されて、以降はブランチを分けない限りmasterブランチにコミットしていくことになる。
作業の流れ
- 「リモートリポジトリ」から「クローン」して作業ディレクトリを作成する。
- 作業ディレクトリで変更したファイルを「インデックス」に「追加」して「コミット」すると「ローカルリポジトリ」に反映される。
- 「ローカルリポジトリ」に反映された変更内容は、「プッシュ」することで「リモートリポジトリ」に反映される。
- 「リモートリポジトリ」に他人が「プッシュ」した内容を「ローカルリポジトリ」に反映させるためには「プル」する。
↓の画像がわかりやすいと思う
mod_rewriteのRewriteCondとRewriteRuleの使い方
業務で.htaccessにリダイレクト設定書くとき詰まったので使い方とかの備忘録。
基本的な形
.htaccessに書くときの基本形は以下のとおり。
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond hoge fuga RewriteRule piyo poyo </IfModule>
事前にhttpd.confでmod_rewriteが有効になってる前提です。
RewriteRule
URL書き換えのルールを指定します。以下はhoge.com/test/
以下に置いた.htaccessの場合。
RewriteRule ^test1¥.html$ test/test2.html [R=301,L]
この場合、hoge.com/test/test1.html
へのアクセスがhoge.com/test/test2.html
にリダイレクトされます。
RewriteRule ^(.+)¥.html$ test2/$1.html [R=301,L]
こんな感じで書くと、グループ化した正規表現にマッチした文字列をリダイレクト先の$1で変数のように使うことも出来ます。
RewriteCond
RewriteRuleを実行するための条件を指定します。直後のRewriteRuleのみに適用されます。以下もhoge.com/test/
以下に置いた.htaccessの場合。
RewriteCond %{QUERY_STRING} ^q=test$ RewriteRule ^test1¥.html$ test/test2.html? [R=301,L]
この場合、q=test
というクエリがついたアクセスがあった場合のみ2行目のRewriteRuleが適用されます。つまり、hoge.com/test/test1.html?q=test
へのアクセスがhoge.com/test/test2.html
にリダイレクトされます。ちなみにRewriteCondを複数行書くとANDで条件を指定できます(後述するフラグで[OR]と明示的に指定すればORで条件を指定することも可能)。
また、RewriteRuleのリダイレクト先指定の最後に?をつけると、クエリが削除されてリダイレクトされます。
参考
Apache module mod_rewrite
RewriteRule でredirect時にquery stringを削除する - うまいぼうblog
Apache変数、フラグ
上記RewriteCondで指定した%{QUERY_STRING}
はApacheで用意されている変数で、クエリ文字列を表します。Apacheが用意している変数は他にもいろいろあります。
参考:Apache RewriteCond の基礎知識 | WEB ARCH LABO
RewriteRuleの行末に指定した[R=301,L]
はフラグと呼ばれるものです。Rはリダイレクト、Lはこのルールにマッチしたら以降のルールは無視することを表しています。フラグも他にいくつか種類があります。