人気ブログランキング |
タグ:Apache ( 9 ) タグの人気記事
(Apache)特定ファイルにアクセスした時にリダイレクト
(Apache)複数ドメインで運用しているサイトを単一ドメインになるようリダイレクトの続きみたいなものですが、今回はディレクトリ内の特定のファイルへのリクエストがあった時にリダイレクトする方法です。

例えば、あるディレクトリに hoge01.html , hoge02.html , hoge03.html とファイルがあり、hoge01.htmlだけMod-Rewriteでリダイレクトしたい場合は以下のようにします。

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^hoge01.htm$ http://newlink/ [R=301,L]


hoge01.htmlとhoge02.htmlを同じページにリダイレクトしたい場合は以下のようにします。

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(hoge01.html|hoge02.html)$ http://newlink/ [R=301,L]

RewriteRuleの指定は正規表現が使えるので、自由度は高いですね。

参考:
.htaccess - Rewrite
by Jehoshaphat | 2012-06-26 00:35 | サーバがらみ
(Apache)複数ドメインで運用しているサイトを単一ドメインになるようリダイレクト
何やら多忙すぎて1ヶ月以上更新が滞ってしまいました。。。

Webサイトの一部を別ドメインに移したためリダイレクトさせてみたで mod_rewrite を使ったリダイレクトを書きました。

今回もそれに関連のある話ですが、あるWebサイトが hoge.jp , www.hoge.jp hoge.com どれでもアクセス可とします。
(DNSサーバの設定で同一サーバを見るようしています。VirtualHostは使っていません。)

これを www.hoge.jp でアクセスするように統一という話が出てきました。

調査すると、.htaccess - Rewriteにどんぴしゃな答えがありました。

Mod-Rewrite のリダイレクトを使って、下記のようにするとこれを実現できます。

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(hoge\.jp)(:80)? [NC,OR]
RewriteCond %{HTTP_HOST} ^(hoge\.com)(:80)? [NC]
RewriteRule ^(.*) http://www.hoge.jp/$1 [R=301,L]

RewriteCond で条件を指定できるようです。
HTTP_HOST 変数にどのドメインでアクセスしてきたかの情報が入っているようですね。
複数条件も指定できるようで、今回はORを指定しています。


ちなみに、mod_rewriteを使うディレクトリでは「Options FollowSymLinks」を指定しないとエラーになるケースがあるので注意しましょう


参考:
mod_rewrite サンプル集/楽
RewriteCond - RewriteRuleの条件を設定
CPIレンタルサーバーでApache mod_rewriteの設定方法|ほっとのブログ
mod_rewriteを使うには「Options FollowSymLinks」が必要 kawama.jp:
by Jehoshaphat | 2012-06-26 00:33 | サーバがらみ
(Apache)名前バーチャルホストを設定したらメインのドキュメントルートにアクセスできなくなった
Apache2.2で以下のように名前バーチャルホストを設定しました。
(一つの IP アドレスでいくつかの名前ベースの ウェブサイトを実行するタイプのバーチャルホストです。)

余談ですが、Apache2.2だと conf\extra\httpd-vhosts.conf に設定を書いてやればいいようです。
(httpd.confで "Include conf/extra/httpd-vhosts.conf" のコメントを退ける必要があります)


NameVirtualHost *:80

<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2
DocumentRoot "E:/mydoc/hogeproject/html"
ServerName hogeserver
ErrorLog "logs/hogeserver-error.log"
CustomLog "logs/hogeserver-access.log" common
</VirtualHost>

<Directory "E:/mydoc/hogeproject/">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>


しかし、これで localhost にアクセスしても、上記で設定したディレクトリのコンテツが表示されてしまうのです。
こちらが意図しているのはデフォルトのドキュメントルート("C:/Program Files/Apache Software Foundation/Apache2.2/htdocs")にアクセスして欲しかったのです。

で、Apacheのマニュアルをみるとこう書いています。
アスタリスクはすべてのアドレスにマッチしますので、主サーバは リクエストを扱いません。www.example.com は 最初にあるため、優先順位は一番高くなり、default もしくは primary のサーバと考えることができます。つまり、リクエストが どの ServerName ディレクティブにもマッチしない場合、 一番最初の VirtualHost により扱われます。
なるほど。* とすると主サーバ、つまりhttpd.confにあるドキュメントルートは使われないようです。
といういことで、以下のようにしました。
これで ServerName と一致しないrequestは上側のデフォルトのドキュメントルートを見に行くようになります。

NameVirtualHost *:80

<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2
ServerName hoge
DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"
ErrorLog "logs/error.log"
CustomLog "logs/access.log" common
</VirtualHost>

<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2
DocumentRoot "E:/mydoc/hogeproject/html"
ServerName hogeserver
ErrorLog "logs/hogeserver-error.log"
CustomLog "logs/hogeserver-access.log" common
</VirtualHost>

<Directory "E:/mydoc/hogeproject/">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>



参考:
(Apache)名前バーチャルホストでハマった
by Jehoshaphat | 2012-05-13 21:36 | サーバがらみ
Subversion on apache で大量ファイルをコミットするとエラーになる

Subversion on apacheでTortoiseSVNから大量ファイルをコミットすると「サーバに接続できませんでした」というエラーになります。
環境は下記のとおりです。
OS:CentOS5.5
Apache 2.2.3 (OSバンドル品)
Subvsersion:mod_dav_svn-1.4.2

で、原因は Apache の KeepAlive が OFF になっていたからでした。
なので、コミット中に top コマンドで確認すると大量に httpd プロセスが存在してました。(ファイル毎にプロセスが立ち上がりプロセス数最大値を超えて接続が切れたんだと思います。)

httpd.conf の KeepAlive を On にすることでコネクションを使い回しするようになり、ちゃんとコミットできました。
普通 apache の KeepAlive でデフォルトでOnになってたと思うんですが、redhat系はoffなんでしょうか・・・

参考:
Subversionで大量のコミット中に接続が切断される
自宅LAN内に、linux(CentOS)サーバーを作り、subversionを設置.. - 人力検索はてな
by Jehoshaphat | 2011-09-23 21:39 | サーバがらみ
Subversion(Apache,Linux)で認証にActiveDirectoryを使う

LinuxでSubVersionを構築しEclipse Subversive から使うではSubversionの認証としてBasic認証を使ってましたが、Windowsドメインを建てているということで、ActiveDirectoryを使って認証してみました。

環境はApache2.2 , CentOS5.5で、ドメインコントローラはWindowsServer2003です。

SubversionはApacheコンポートネントとして動かしているため、普通のWEBサーバとしての認証でも使えるかと思います。


ActiveDirectoryとの認証方法はいくつかあるようですが、今回はLDAPでの認証を試しました。
(LDAPを使ってもAuthTypeはBasicでないといけないのでパスワードは平文で流れてしまいます。)

LDAPでActiveDirectoryの認証情報を使うには、下記のように設定ファイルを編集すればOKです。(認証部分のみ)

/etc/httpd/conf.d/subversion.conf

<Location /svn>
AuthType Basic
AuthName "Subversion Repositoryr"
AuthBasicProvider ldap (認証方式。LDAPを使う)
AuthLDAPUrl "ldap://hogesv01:389/OU=person,dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDN userhoge@hogedomain.jp
AuthLDAPBindPassword userhogeのパスワード
Require ldap-attribute objectClass=person
</Location>


AuthLDAPUrlはLDAP URLと呼ばれるもので下記の書式になるようです。

ldap://host:port/basedn?attribute?scope?filter

host : これはドメインコントローラを指定します。
port : LDAPだと389になります。
basedn : 検索の起点となる識別名(DN)を指定します。
attribute : 検索対象の属性です。sAMAccountNameはWindowsのログイン名になります。
scope : 検索する深さを指定します。one(1階層のみ検索)またはsub(下位の階層も検索)です。
filter : 検索のLDAPフィルターです。(objectClass=*)となっているのでツリー上の全てのオブジェクトを検索します。


ここで一つ問題が出てきました。
basedn部分で、OUまで含めないとサーバエラーとなってしまう点です。つまり、OUは必ず指定しないといけません。
しかし、今回ドメイン直下には複数のOUがあり、それぞれにユーザアカウントオブジェクトがあるのです。
仮に下記のように試してみましたが、下の行の設定だけが有効になってしまう状態でした。

AuthLDAPUrl "ldap://hogesv01:389/OU=person,dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPUrl "ldap://hogesv01:389/OU=devlop,dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)"


で、調査したところ、Trac と mod_pythonの中ほどに答えが。。。
portをActiveDirectoryのグローバルカタログ(ポート3268)にすれば、basednでOUを指定しなくてもディレクトリ全体が検索範囲になることが分かりました。(グローバルカタログはフォレスト内の全ドメインの全オブジェクトから、ひんぱんに利用する属性のみを抽出したものです。)
AuthLDAPUrlは下記のようになります。

AuthLDAPUrl "ldap://hogesv01:3268/dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)"



AuthLDAPBindDNはActiveDirectoryにアクセスするためのユーザ名です。管理者権限持ってなくもActiveDirectory内のユーザで有ればどれでもいいようです。
AuthLDAPBindPasswordで、AuthLDAPBindDNで指定したユーザのパスワードを指定します。


Requireでどのユーザに対してアクセスを許可するか設定します。(特定のユーザや特定のグループだけならAuthLDAPUrlのフィルタで設定してしまう方法も有ります)
下記にいくつかの設定例を紹介します。

LDAPディレクトリ内の全ユーザに許可する
Require valid-user

LDAPディレクトリ内のtest01 test02ユーザだけ許可する
Require ldap-user test01 test02

LDAPディレクトリ内のグループdev supportグループに属するユーザだけ許可する
AuthLDAPGroupAttribute member
AuthLDAPGroupAttributeIsDN on
Require ldap-group CN=dev,CN=Users,DC=hogedomain,DC=jp
Require ldap-group CN=support,CN=Users,DC=hogedomain,DC=jp

グループの識別名(DN)を取得するには、ADSI Edit が有用です。
ADSI Edit については、(ADSI)ActiveDirectoryのオブジェクトの属性をのぞきたいが参考になります。


参考:
開発リソース/Unix/Apache2でmod_auth_ldapを利用したActiveDirectoryベースの認証
LDAPによるApacheの認証と認可
The auth_ldap Module for Apache


今回はLDAPを使ってApacheからActiveDirecotryへの認証を行いましたが、KERBEROS認証やNTLM認証(winbind+samba)、SSPI、SPNEGO認証を用いる方法があるようです。(方法によってはシングルサインオンできそうですね。)
とりあえず参考になりそうなページだけリンクはっておきます。
●KERBEROS認証
Apache/認証にActiveDirectoryを使う方法
ActiveDirectoryでApacheの認証を
mod_auth_kerb で Basic認証を有効にする (Active Directory を使ったシングルサインオン)

●NTLM認証
Apache(Linux)に、Windowsドメイン認証を利用して、シングルサインオンを実現する詳細手順 - RX-7乗りの適当な日々
ActiveDirectoryとSUSE11.3(LINUX)上のapacheでシングルサインオンを利用する
Apacheで統合Windows認証を使う

●SSPI
ドメイン認証(mod_sspi) - なんとなく ~学習もかねて~
2008/01/28 日記: Microsoft セキュリティ サポート プロバイダ インターフェイス / Microsoft Security Support Providers Interface (SSPI)
Apache ベースのサーバ

●SPNEGO認証
Subversion にも SPNEGO 認証:お試しlog4
SPNEGO
by Jehoshaphat | 2011-09-21 23:20 | Linux
Apache2.2でダイジェスト認証
(よーやく仕事見つかったんですが、なれない業務に疲れ気味の3流PGです。。。。)

さて、Apache2.2で運用するWEBページに認証をかけることになったんですが、ベーシック認証だと暗号化されてないんで、DIGEST認証を使うことにしました。

Apache2.0の時代とちょっと変わってるところがあってハマりましたね。

まずApache上のアカウントを作成します。


htdigest -c /etc/httpd/.htpasswd_dig realm username

(-c は初めてパスワードファイルを作る時のみ指定します。)

後はApache側の設定ですが、.htaccessに各方法と、httpd.conf で<Directory "/var/www/html/member"></Directory>に入れる方法があります。
まぁどっちでも書式はほぼ一緒なんですが、今回は.htaccessを使うことにしました。


AuthType Digest
AuthName realm
AuthUserFile /etc/httpd/.htpasswd_dig
Require valid-user

ハマったのは AuthUserFile です。Apache2.0だとここは AuthDigestFile だったんですよね。
あと、Require の設定はこんな感じになります。

Require user hoge ←この場合hogeしか入れない
Require user hoge aaa ←この場合hogeとaaaしか入れない
Require valid-user ←全ユーザが入れる


参考:
@IT:Apacheでユーザー認証を行うには(Digest認証編) これはApache2.0の設定なのでこのままApache2.2に適用すると動きません。
Apacheで認証をしたい。 これもApache2.0時の設定です。
floatingdays: Apache2.2のDigest認証設定
by jehoshaphat | 2009-12-01 22:43 | サーバがらみ
(PHP)XServerでXOOPSが真っ白に。。。
レンタルサーバのXServer上で動かしてるXOOPSが真っ白になっているということで調査開始しました。

まず、PHPエラーを調べるために、phpMyAdmin で MySQL の xoops_config テーブル conf_name列= debug_mode レコードの conf_value の値を1にします。

これでリロードするとこんなエラーが。。

Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}'
in /home/ユーザ名/public_html/xoops/modules/Analyzer/preload/Preload.class.php on line 10

なんか文法エラーとか言ってます。

このファイルは更新した記憶はまったくないので、もしかしてと思って phpinfo で実行環境の情報を探ってみました。
すると、PHP5 で動かしてたはずなのに、PHP4 になってます。

とりあず、PHP5 に戻せば動くと思って、ServerPanel の "PHP Ver.切替" より PHP5 に戻しました。


その後なぜPHP5から4になってしまったかの調査です。

調べていくと、Xserver は PHP4 と 5 の切り替えは、public_html/.htaccess の中で

AddHandler x-httpd-php5 .php .phps

という定義で行っていることが分かりました。

つまり、この記述がないと PHP4 で動くみたいです。

そういえば、PEAR の include_path を設定するときにこの辺触ったので、その時にこの記述を上書きしてしまったことが今回の障害の原因のようです。
by jehoshaphat | 2009-09-18 12:55 | PHP開発
(Apache)名前バーチャルホストでハマった
Apache2.2の話。

LAN内にDNSサーバ持ってるので、それでWEB開発用PCに複数のホスト名をふって、名前バーチャルホストで開発サイトを簡単に切り替えられるようにしたかったんですが、ハマりました。

最初、httpd.conf には下記のように設定してました。

<VirtualHost *:80>
ServerName pc1
DocumentRoot "D:/eclipse_workspace/site1/public_html/"
ErrorLog logs/error_log
TransferLog logs/access_log
<Directory "D:/eclipse_workspace/site1/public_html/">
Options Indexes FollowSymLinks
AllowOverride All
order deny,allow
deny from ALL
allow from ALL
</Directory>
</VirtualHost>
 
<VirtualHost *:80>
ServerName pc2
DocumentRoot "D:/eclipse_workspace/site2/public_html/"
ErrorLog logs/error_log
TransferLog logs/access_log
<Directory "D:/eclipse_workspace/site2/public_html/">
Options Indexes FollowSymLinks
AllowOverride All
order deny,allow
deny from ALL
allow from ALL
</Directory>
</VirtualHost>


で、二つ目のバーチャルホスト(http://pc2/)にアクセスしても、pc1で設定したほうが表示されます。
あれっ?と思って、Apacheのログを見ると、

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

ってなってました。
最初に設定したバーチャルホストが有効になってるっぽいです。

で、調べてみると、下記の設定が抜けてました。
NameVirtualHost *:80


ずっと前に Apahce 触ったときはこれを付けた記憶がなかったんで、すっかり見落としてました。
やっぱり頭ん中の記憶だけに頼るとミスりますね。。。

参考:
apache2.2 バーチャルホストの設定 前編
Apacheドキュメント
by jehoshaphat | 2009-09-14 12:46 | サーバがらみ
Webサイトの一部を別ドメインに移したためリダイレクトさせてみた

Webサイトの一部の動的なコンテンツをもっとサクサク動くレンタルサーバーに移行することになりました。

で、移行後に古いURLで来た人を移行後のサイトに移すために、リダイレクトをすることに。。

当初は、JavaScript で「新しいページに移行しました。○○後に自動的に飛びます」的な感じにしようかと思ってたんですが、調べてみるとリダイレクトする方法いろいろあったんですね。

Like@Lunatic:リダイレクト手法まとめによると、HTTPの301レスポンスコードを使う方法、HTMLの meta データを使う方法、JavaScriptの location.href を使う方法があるようです。

SEO的にお勧め間のは HTTP 301 レスポンスコード(301リダイレクト)使う方法みたいなので、これで行くことにしました。
要件としては、http://www.oldurl.com/forum/ 配下のアクセスを新しい http://www.newurl.com/forum/ にリダイレクトさすというものです。

最初、.htaccessファイルに

Redirect permanent /forum/ http://www.newurl.com/forum/

という方法でやってたんですが、どうもレンタルサーバのApacheがうまくやってくれないようで。。。

なので、Mod-Rewrite モジュールを使う方法にしました。
.htaccessファイルにこんな感じで設定し、/forum/ の配下に置きます。

RewriteEngine On
RewriteRule ^(.*) http://www.newurl.com/forum/$1 [R=301,L]

これで、http://www.oldurl.com/forum/index.php?ID=11 とかのパラメータ付きクエリも http://www.newurl.com/forum/index.php?ID=11 というようにちゃんとリダイレクトできるようになりました。


参考:
301リダイレクトの設定方法
CSS Lecture:301リダイレクトの記述方法
btmup Blog:PHPのページをWordPressのブログに301リダイレクトする。
mod_rewrite
by jehoshaphat | 2009-08-24 22:44 | Webがらみ