お世話になります。
現在、htaccessファイルへ処理命令を自動で記述するプログラムを開発しています。
悩んでいるのは、.htaccessファイルに処理命令を書き込む際のエスケープ漏れ?についてです。
エスケープ漏れというか、単に私の書き方が悪いのだと思うので、ぜひお知恵を借りたいです。
処理内容
まず、最初の処理で以下のような文字列が生成されます。
スラッグの部分を正規表現で取得して新しいサイトでそれを使おうとしています。
<IfModule mod_rewrite.c> #元のURL:http:old.com RewriteEngine On RewriteCond %{HTTP_HOST} ^old.com RewriteCond %{REQUEST_URI} ^/hello\-world/?$ RewriteRule ^([^/]+?)?$ https\://new.com/$1 [R=302,L] </IfModule>
その後、この文字列と元々htaccessファイルにあった文字列を合体させて、file_put_content関数で既存のhtaccessファイルと置き換えます。
php
1file_put_contents( htaccessのパス, 新しく生成されたhtaccessファイル );
問題点
基本的に問題なく動くのですが、極稀に後方参照のために記述している$1がそのまま表示されます。
本来は、リダイレクトのURLは「https://new.com/hello-world」になるはずが、「https://new.com/$1」となります。
この現象が起こる環境が特定できず、困っております。
文字コードが原因なのかなと、mb_convert_encoding関数でutf-8に変換してみたのですが、そういう問題ではなさそうです。
このコードは何がいけないのでしょうか?
追記
非常にざっくりとですが、今現在このようなリダイレクト処理を自動化するプログラムを作っています。
php
1 2【ファイルA】 3#URLはユーザーに入力してもらう 4$new_site_url = 'https://new.com/'; 5#http://old.com/hello-worldの記事にアクセスした時にリダイレクトする 6$rewrite_cond = 'RewriteCond %{HTTP_HOST} ^old.com$'.PHP_EOL; 7$rewrite_cond .= 'RewriteCond %{REQUEST_URI} ^/hello-world/?$'.PHP_EOL; 8$rewrite_rule = 'RewriteRule ^([^/]+?)?$ '.$new_site_url.'$1 [R=302,L]'; 9 10#ファイルB用に処理内容を出力 11$text = <<< EOM 12<IfModule mod_rewrite.c> 13RewriteEngine On 14$rewrite_cond 15$rewrite_rule 16</IfModule> 17EOM 18 19echo $text; 20
php
1 2【ファイルB】 3 4ob_start(); 5require_once(ファイルA); 6$new_text = ob_get_clean(); //ファイルAから処理内容を受け取って変数へ 7 8$htaccess = ABSPATH.'.htaccess'; 9 10$htaccess_text = @file_get_contents( $htaccess ); 11 12$htaccess_text = $new_text.PHP_EOL.$htaccess_text; 13 14file_put_contents($htaccess, $htaccess_text); 15
なぜ$1だけピンポイントで消えるのか、どこで消えているのかが、理解できませんでした。
詳細なコードはGithubの方で公開しているので、もしコードに不備があるようでしたらご覧いただけると嬉しいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/09 01:20
2019/03/09 02:54
2019/03/09 02:55
2019/03/09 06:54