mod_rewriteについてお聞きします。

下記のような静的ページが複数あります。(○○○.htmlは複数ページ)
hogehoge.jp/abc/○○○.html
hogehoge.jp/abc/def/○○○.html
下記のような動的ページが複数あります(PATH_INFOを使用して、静的ページに見せています)
hogehoge.jp/abc/xyz/○○○.html
この動的ページをhogehoge.jp/abc/○○○.htmlと見せることはできないでしょうか、
勿論静的ページと動的ページのファイルネームは違う名前になっています。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2009/05/20 18:49:52
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.3

回答回数595ベストアンサー獲得回数351

ポイント200pt

Apacheが起動できなくなるのは、おそらくRewriteBaseが原因ではないかと思います。

RewriteBaseをどこに書いているでしょうか?

「directory」ディレクティブと「.htaccess」でのみ使用できます。

http://httpd.apache.org/docs/2.2/ja/mod/mod_rewrite.html#rewrite...

http://httpd.apache.org/docs/2.2/ja/mod/directive-dict.html#Cont...


>○○○.html は複数あるために、どうしてよいのか分かりません。

実行するCGI(PHP?)のアドレスと見せかけたい静的ファイルのアドレスには、何か規則性はあるのでしょうか?

規則がない場合は、面倒でも各ファイル用にRewriteRuleを記述するしかないと思います。

例えば、

「hogehoge.jp/abc/hogehoge.cgi?dir=xyz&mode=○&page=△」を実行すると生成される「hogehoge.jp/abc/xyz/○_△.html」を「hogehoge.jp/abc/○○○.html」に見せかけたい

「hogehoge.jp/abc/hogehoge.cgi?dir=uvw&mode=◎&page=●」を実行すると生成される「hogehoge.jp/abc/uvw/◎_●.html」を「hogehoge.jp/abc/def/○○○.html」に見せかけたい

「hogehoge.jp/abc/hogehoge.cgi?dir=rst&mode=□&page=×」を実行すると生成される「hogehoge.jp/abc/rst/□_×.html」を「hogehoge.jp/abc/ghi/○○○.html」に見せかけたい

・・・という場合には規則性がないので、それぞれのRewriteRuleを記述する必要があります。

RewriteEngine On

RewriteBase /

RewriteRule ^abc/○○○.html$ /abc/hogehoge.cgi?dir=xyz&mode=○&page=△ [L]

RewriteRule ^abc/def/○○○.html$ /abc/hogehoge.cgi?dir=uvw&mode=◎&page=● [L]

RewriteRule ^abc/ghi/○○○.html$ /abc/hogehoge.cgi?dir=rst&mode=□&page=× [L]

※「httpd.conf」の「directory」ディレクティブ内に記述します。


例えば、

「hogehoge.jp/abc/hogehoge.cgi?dir=xyz&mode=○&page=△」を実行すると生成される「hogehoge.jp/abc/xyz/○_△.html」を「hogehoge.jp/abc/○_△.html」に見せかけたい

「hogehoge.jp/abc/hogehoge.cgi?dir=xyz&mode=◎&page=●」を実行すると生成される「hogehoge.jp/abc/xyz/◎_●.html」を「hogehoge.jp/def/◎_●.html」に見せかけたい

「hogehoge.jp/abc/hogehoge.cgi?dir=xyz&mode=□&page=×」を実行すると生成される「hogehoge.jp/abc/xyz/□_×.html」を「hogehoge.jp/ghi/□_×.html」に見せかけたい

・・・と言う場合には、次のように1つにまとめる事が出来ます。

RewriteEngine On

RewriteBase /

RewriteRule ^[a-z]{3}/(.*)_(.*)\.html$ /abc/hogehoge.cgi?dir=xyz&mode=$1&page=$2 [L]



※細かいやり取りが必要になりそうですので、コメント欄を開けてくださると助かります。

id:nijinohasi

【1】Directoryの中に書いたら、再起動できましたが、URLの書き換えはできませんでした。

<Directory /home/homepage/public_html>

RewriteEngine on

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([A-Za-z0-9_]+)/(.*) $1/xyz/$2

</Directory>

【2】○○○.htmlは数千ページあり、○○○の部分は名詞なので、

   1つずつ記述するのは困難です。

2009/05/18 09:25:41

その他の回答2件)

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

ポイント100pt

可能です。

「hogehoge.jp」のルートに「.htaccess」を置いた場合、以下のような記述になります。

RewriteEngine on

RewriteRule ^abc/○○○.html /abc/hogehoge.cgi [L]


※「/abc/hogehoge.cgi」の部分は、「hogehoge.jp/abc/xyz/○○○.html」を生成するアドレスにします。

上記の記述で、「hogehoge.jp/abc/○○○.html」にアクセスした場合に、「hogehoge.jp/abc/hogehoge.cgi」を実行して表示します。(※アドレスは変わりません。)

http://www.nishishi.com/blog/2006/01/dynamic_to_stat.html

http://q.hatena.ne.jp/1155728241

id:nijinohasi

すいません、ありがとうございます。

○○○.html は複数あるために、どうしてよいのか分かりません。

ちなみに.htaccessは使用せず、httpd.confに直接書き込んでいます

2009/05/17 19:22:30
id:makoohira No.2

回答回数136ベストアンサー獲得回数4

ポイント20pt

テストしていませんが、

RewriteEngine on

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([A-Za-z0-9_]+)/(.*) $1/xyz/$2

これでたぶん行けると思います。

3,4行目で、そのファイル名が実在しているか確認して、なかった場合のみ、

リクエストを書き換えていますので、混雑することはないと思います。

id:nijinohasi

ありがとうございます。

これの必要な部分を編集しhttpd.confに書き込んでApacheの

再起動をすると、起動できなくなります。

どこか、間違っている部分は無いでしょうか。

2009/05/17 19:25:33
id:rouge_2008 No.3

回答回数595ベストアンサー獲得回数351ここでベストアンサー

ポイント200pt

Apacheが起動できなくなるのは、おそらくRewriteBaseが原因ではないかと思います。

RewriteBaseをどこに書いているでしょうか?

「directory」ディレクティブと「.htaccess」でのみ使用できます。

http://httpd.apache.org/docs/2.2/ja/mod/mod_rewrite.html#rewrite...

http://httpd.apache.org/docs/2.2/ja/mod/directive-dict.html#Cont...


>○○○.html は複数あるために、どうしてよいのか分かりません。

実行するCGI(PHP?)のアドレスと見せかけたい静的ファイルのアドレスには、何か規則性はあるのでしょうか?

規則がない場合は、面倒でも各ファイル用にRewriteRuleを記述するしかないと思います。

例えば、

「hogehoge.jp/abc/hogehoge.cgi?dir=xyz&mode=○&page=△」を実行すると生成される「hogehoge.jp/abc/xyz/○_△.html」を「hogehoge.jp/abc/○○○.html」に見せかけたい

「hogehoge.jp/abc/hogehoge.cgi?dir=uvw&mode=◎&page=●」を実行すると生成される「hogehoge.jp/abc/uvw/◎_●.html」を「hogehoge.jp/abc/def/○○○.html」に見せかけたい

「hogehoge.jp/abc/hogehoge.cgi?dir=rst&mode=□&page=×」を実行すると生成される「hogehoge.jp/abc/rst/□_×.html」を「hogehoge.jp/abc/ghi/○○○.html」に見せかけたい

・・・という場合には規則性がないので、それぞれのRewriteRuleを記述する必要があります。

RewriteEngine On

RewriteBase /

RewriteRule ^abc/○○○.html$ /abc/hogehoge.cgi?dir=xyz&mode=○&page=△ [L]

RewriteRule ^abc/def/○○○.html$ /abc/hogehoge.cgi?dir=uvw&mode=◎&page=● [L]

RewriteRule ^abc/ghi/○○○.html$ /abc/hogehoge.cgi?dir=rst&mode=□&page=× [L]

※「httpd.conf」の「directory」ディレクティブ内に記述します。


例えば、

「hogehoge.jp/abc/hogehoge.cgi?dir=xyz&mode=○&page=△」を実行すると生成される「hogehoge.jp/abc/xyz/○_△.html」を「hogehoge.jp/abc/○_△.html」に見せかけたい

「hogehoge.jp/abc/hogehoge.cgi?dir=xyz&mode=◎&page=●」を実行すると生成される「hogehoge.jp/abc/xyz/◎_●.html」を「hogehoge.jp/def/◎_●.html」に見せかけたい

「hogehoge.jp/abc/hogehoge.cgi?dir=xyz&mode=□&page=×」を実行すると生成される「hogehoge.jp/abc/xyz/□_×.html」を「hogehoge.jp/ghi/□_×.html」に見せかけたい

・・・と言う場合には、次のように1つにまとめる事が出来ます。

RewriteEngine On

RewriteBase /

RewriteRule ^[a-z]{3}/(.*)_(.*)\.html$ /abc/hogehoge.cgi?dir=xyz&mode=$1&page=$2 [L]



※細かいやり取りが必要になりそうですので、コメント欄を開けてくださると助かります。

id:nijinohasi

【1】Directoryの中に書いたら、再起動できましたが、URLの書き換えはできませんでした。

<Directory /home/homepage/public_html>

RewriteEngine on

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([A-Za-z0-9_]+)/(.*) $1/xyz/$2

</Directory>

【2】○○○.htmlは数千ページあり、○○○の部分は名詞なので、

   1つずつ記述するのは困難です。

2009/05/18 09:25:41
  • id:rouge_2008
    静的ファイルの名前と動的ファイルの名前は違うのですよね?

    【1】makoohiraさんが提示した方法では、おそらく出来ないと思います。
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    上記の記述があると、ファイルやディレクトリが実在する場合は動作しません。
    ご本人も回答内で『そのファイル名が実在しているか確認して、なかった場合のみ、リクエストを書き換えています』と書いています。
    今回の場合は、実在するファイルに見せかけたいという事のようですので、上記の記述は不要だと思います。
    また、以下の記述は「hogehoge.jp/ディレクトリ名/ファイル名」にアクセス(要求)があった場合には、「hogehoge.jp/要求のあったディレクトリ名/xyz/要求のあったファイル名」を読み込んで表示するというルールなのですが、ディレクトリやファイル名が違うのでしたら動作しないと思います。

    RewriteRule ^([A-Za-z0-9_]+)/(.*) $1/xyz/$2

    また、もしディレクトリ名やファイル名が同じでも、PATH_INFOで使えるようにしたアドレスでは動作しない可能性があります。
    ※私の環境では動作しませんでしたので、直接CGI(またはPHP)を動かす記述を紹介しました。


    【2】何かファイル名またはアドレスに規則はないのですか?
    例えば、静的ファイルの名前と動的ファイルの名前は違うけれど、以下のように規則性がある場合は、1つの記述で済みます。

    「hogehoge.jp/abc/hogehoge.cgi?mode=view&cat=cat1&page=apple」を実行すると生成される「hogehoge.jp/abc/cat1/apple.html」を「hogehoge.jp/abc/cat1_apple.html」に見せかける

    「hogehoge.jp/abc/hogehoge.cgi?mode=view&cat=cat2&page=orange」を実行すると生成される「hogehoge.jp/abc/cat2/carrot.html」を「hogehoge.jp/abc/cat2_carrot.html」に見せかける

    ※上記の場合は、「mode」が同じで「_(アンダーバー)」で区切ったファイル名の前の部分に「cat」、ファイル名の後ろの部分に「page」の値が使われているという規則性があります。

    RewriteRule ^abc/(.+)_(.+).html$ /abc/hogehoge.cgi?mode=view&cat=$1&page=$2 [L]


    このような規則性がないという場合は、見せかけるファイルの名前を変更(※実際にファイル名変更するという意味ではありません。)して対応するしかないと思います。
    リンクの変更などの作業も膨大で無理という場合は、CGI(PHP?)の方の動的ファイル生成の動作部分を変更するしかないと思いますが、こちらも難しいので、詳しい人がいないと実現できません。

    例えば、本来は以下で動作する物を

    RewriteRule ^abc/(.+)_(.+)\.html$ /abc/hogehoge.cgi?mode=view&cat=$1&page=$2 [L]

    以下で動作するようにスクリプトの方を変更する。

    RewriteRule ^abc/(.+)\.html$ /abc/hogehoge.cgi?mode=view&page=$1 [L]


    とりあえず、アドレスに規則があるかどうか判断したいので、実際の静的ファイル名とCGI(PHP?)のアドレスを引数まで含めて、2つくらい教えていただけないでしょうか?
    「○○○の部分は名詞」だけでは、どのような状態なのか分かりません。
    もちろん、ドメイン名は伏せても大丈夫です。
  • id:nijinohasi
    rouge_2008 様へ 何度もありがとうございます。

    下記の記述で、動的ページは、ディレクトリの短縮が成功しました。
    RewriteEngine on
    RewriteRule ^/abc/(.*)$ /abc/xyz/$1 [L]

    hogehoge.jp/abc/xyz/○○○.html
      ↓↓↓ 下記のURLでアクセスOK!
    hogehoge.jp/abc/○○○.html

    しかし、hogehoge.jp/abc/の中にある静的ページがアクセスできなく
    なったので、静的ページを少なくして、下記のページがある場合のみ
    書き換えないとはできないでしょうか。
    hogehoge.jp/abc/index.html
    hogehoge.jp/abc/company.html
    hogehoge.jp/abc/flow.html
    大変お手数ですが、よろしくお願いいたします。
  • id:rouge_2008
    以下でいかがでしょうか?
    除外ファイルの指定行をルールの前に追加しています。

    RewriteEngine on
    RewriteCond %{REQUEST_URI} !(index|company|flow)\.html$
    RewriteRule ^/abc/(.*)$ /abc/xyz/$1 [L]

    http://faq.infolinux.jp/?p=151

    http://d.hatena.ne.jp/koto2/20080630/1214817129
  • id:rouge_2008
    上記の記述だと、ファイル名をつけないでabcディレクトリにアクセスするとエラーになります。
    以下に変更して試してみてください。

    RewriteCond %{REQUEST_URI} !(^|(index|company|flow)\.html?)$
  • id:nijinohasi
    rouge_2008様 何度もありがとうございます。(コメントを送信したつもりだったのですが
    なぜか表示されていなかったので、たいへん遅くなりました)

    下記の記述で一応は動作するのですが、一部問題があるので、もう少し教えて頂けますか

    RewriteEngine on
    RewriteCond %{REQUEST_URI} !(^|(index|company|flow)\.html)$
    RewriteRule ^/abc/(.*)$ /abc/xyz/$1 [L]

    hogehoge.jp/abc/index.html では問題なく表示できるのですが

    hogehoge.jp/abc/
    hogehoge.jp/abc
    ではエラーになって表示ができません、この二つもhogehoge.jp/abc/index.htmlの
    内容を表示して、URLはhogehoge.jp/abc/ のままで表示することができませんか
    たいへんお手数ですが、よろしくお願いいたします。
  • id:rouge_2008
    それでは先にコメントした方も試してみてください。
    ※「RewriteBase /」を忘れていましたが、記述してありますか?

    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_URI} !(index|company|flow)\.html$
    RewriteRule ^/abc/(.*)$ /abc/xyz/$1 [L]


    出来ない場合は以下の記述で

    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_URI} !(^|(index|company|flow)\.html)$
    RewriteRule ^/abc/(.+)$ /abc/xyz/$1 [L]


    それでも駄目な場合は以下も試してみてください。

    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_URI} !(^|(index|company|flow)\.html)$
    RewriteRule ^/abc/([a-z0-9._%&=#-]+)$ /abc/xyz/$1 [L]

  • id:nijinohasi
    rouge_2008 様 何度もお手数をお掛けしました、何とか希望通りの動作ができました
    <Directory /home/homepage/public_html>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_URI} !(^|(index|company|flow)\.html)$
    RewriteRule ^/abc/([a-z0-9._%&=#-]+)$ /abc/xyz/$1 [L]
    </Directory>
    では書き換えができなかったので

    <VirtualHost XXX.xxx.xxx.xxx>

    RewriteEngine on
    RewriteCond %{REQUEST_URI} !(^|(index|company|flow)\.html)$
    RewriteRule ^/abc/([a-z0-9._%&=#-]+)$ /abc/xyz/$1 [L]
    </VirtualHost>
    上記でほぼ希望通りになるのですが、hogehoge.jp/abc/で再読み込みした時だけ
    エラーになるので

    <VirtualHost XXX.xxx.xxx.xxx>

    RewriteEngine on
    RewriteCond %{REQUEST_URI} !(^|(index|company|flow)\.html)$
    RewriteRule ^/abc/([a-z0-9._%&=#-]+)$ /abc/xyz/$1
    RewriteRule ^/abc/$ /abc/index.html [L]
    </VirtualHost>
    のようにしましたら、記述方法はおかしいのかもしれませんが
    希望通りの動作ができました。
    何度もお手間を取らせ、たいへんお世話になり、ありがとうございました。
  • id:rouge_2008
    大変すみません。うっかりミスです。
    条件の先頭(^の後ろ)の「/」を外して試してみてください。

    <Directory /home/homepage/public_html>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_URI} !(^|(index|company|flow)\.html)$
    RewriteRule ^abc/([a-z0-9._%&=#-]+)$ /abc/xyz/$1 [L]
    </Directory>


    環境によって違うかもしれませんが、こちらでは上記のようにDirectoryディレクティブに書いた場合と、次のようにVirtualHostディレクティブ(httpd-vhosts.conf)に書いた場合の動作は同じです。(※Directoryディレクティブ内の記述は、上記どちらも同じです。)


    <VirtualHost *:80>
    DocumentRoot /home/homepage/public_html
    ServerName hogehoge.jp
    <Directory /home/homepage/public_html>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_URI} !(^|(index|company|flow)\.html)$
    RewriteRule ^abc/([a-z0-9._%&=#-]+)$ /abc/xyz/$1 [L]
    </Directory>
    </VirtualHost>


    たくさんのポイントといるかをありがとうございました。m(__)m

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません