以下の書き換えを行う前に、すべての.php
ファイルが書き換えられます。
test.php => test
foo.php => foo
このhttp://www.testdomain.com/test?name=john&id=2&nick=doe
をhttp://www.testdomain.com/test/john/2/doe
に書き換えたいです。
test
はインデックスファイルです。
私はこれらのメソッドを書き換えようとしました:
方法1:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/(.*)$ test?name=$1&id=$2&nick=$3 [L,QSA]
方法2:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/(.*)$ test.php?name=$1&id=$2&nick=$3 [L,QSA]
方法3:
RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /test?name=$1&id=$2&nick=$3 [L]
更新された.htaccessファイル content:
RewriteEngine On
RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L]
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* - [L,R=404]
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^name=([\w]+)\&id=([\d]{1,3})\&nick=([\w]+)$
RewriteRule .* /test/%1/%2/%3? [R=301,L]
それらはすべて機能していません(URLは有効のままではありません)!何が間違っていますか?
2つのオプションが有効であると述べたので、2番目のオプションhttp://www.testdomain.com/john/2/doe
を使用し、クリーンな.htaccessを想定しています
RewriteEngine On
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^name=([\w]+)\&id=([\d]{1,3})\&nick=([\w]+)$
RewriteRule .* /%1/%2/%3? [R=301,L]
ファイルまたはディレクトリをチェックするコメント行は、状況に応じてコメント解除される場合があります。サイトでのリクエストは次のようになります。
http://www.example.com/test.php?name=john&id=2&nick=doe
ファイルtest.php
があり、既存のファイルのチェックに関する行のコメントを外すと、満たされていない条件のために、私が書いたルールは失敗します。そのファイルがない場合は、行のコメントを解除できます。同じことがディレクトリにも当てはまりますが、拡張子付きのディレクトリがあるとは思わないので安全です。
上記のルールは変換します
http://www.example.com/test?name=john&id=2&nick=doe
に
http://www.example.com/john/2/doe
Linux上のApache 2.2.25を使用した仮想サーバーでテストしました。
以下は、分析したい場合のテストの書き換えログです。フォルダとローカル仮想サーバーの名前が異なる場合、その情報の名前を変更するときに重要なものを変更しなかったことを望みます。
127.0.0.1 - - [28/Mar/2014:00:03:50 +0800] [www.example.com/sid#cee650][rid#7fe164002970/initial] (3) [perdir /mnt/webs/folder/] strip per-dir prefix: /mnt/webs/folder/test.php -> test.php
127.0.0.1 - - [28/Mar/2014:00:03:50 +0800] [www.example.com/sid#cee650][rid#7fe164002970/initial] (3) [perdir /mnt/webs/folder/] applying pattern '.*' to uri 'test.php'
127.0.0.1 - - [28/Mar/2014:00:03:50 +0800] [www.example.com/sid#cee650][rid#7fe164002970/initial] (2) [perdir /mnt/webs/folder/] rewrite 'test.php' -> '/john/2/doe?'
127.0.0.1 - - [28/Mar/2014:00:03:50 +0800] [www.example.com/sid#cee650][rid#7fe164002970/initial] (3) split uri=/john/2/doe? -> uri=/john/2/doe, args=<none>
127.0.0.1 - - [28/Mar/2014:00:03:50 +0800] [www.example.com/sid#cee650][rid#7fe164002970/initial] (2) [perdir /mnt/webs/folder/] explicitly forcing redirect with http://www.example.com/john/2/doe
127.0.0.1 - - [28/Mar/2014:00:03:50 +0800] [www.example.com/sid#cee650][rid#7fe164002970/initial] (1) [perdir /mnt/webs/folder/] escaping http://www.example.com/john/2/doe for redirect
127.0.0.1 - - [28/Mar/2014:00:03:50 +0800] [www.example.com/sid#cee650][rid#7fe164002970/initial] (1) [perdir /mnt/webs/folder/] redirect to http://www.example.com/john/2/doe [REDIRECT/301]
127.0.0.1 - - [28/Mar/2014:00:03:50 +0800] [www.example.com/sid#cee650][rid#7fe164006990/initial] (3) [perdir /mnt/webs/folder/] add path info postfix: /mnt/webs/folder/john -> /mnt/webs/folder/john/2/doe
127.0.0.1 - - [28/Mar/2014:00:03:50 +0800] [www.example.com/sid#cee650][rid#7fe164006990/initial] (3) [perdir /mnt/webs/folder/] strip per-dir prefix: /mnt/webs/folder/john/2/doe -> john/2/doe
127.0.0.1 - - [28/Mar/2014:00:03:50 +0800] [www.example.com/sid#cee650][rid#7fe164006990/initial] (3) [perdir /mnt/webs/folder/] applying pattern '.*' to uri 'john/2/doe'
127.0.0.1 - - [28/Mar/2014:00:03:50 +0800] [www.example.com/sid#cee650][rid#7fe164006990/initial] (1) [perdir /mnt/webs/folder/] pass through /mnt/webs/folder/john
コメントに従って更新最終URLでテストする場合は、これを使用します。
RewriteRule .* /test/%1/%2/%3? [R=301,L]
インデックスファイルが必要な場合は、これを使用します。
RewriteRule .* /index.php/%1/%2/%3? [R=301,L]
私は同様のルールを持っていました、これを試してください:
RewriteEngine On
RewriteBase /
RewriteRule ^test/([A-Za-z0-9-]+)/([0-9]+)/([A-Za-z0-9-]+)/?$ test.php?name=$1&id=$2&nick=$3
リンクは次のとおりです。
test.php?name=john&id=2&nick=doe
あなたの「方法2」は、http://www.testdomain.com/john/2/doe
に一致するように私に適切に見えます。
のみ、次のようなRewriteBase /
も追加しようとする場合があります。
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/(.*)$ test.php?name=$1&id=$2&nick=$3 [L,QSA]
ベースの代わりに、正規表現の先頭にスラッシュを追加してみてください:
RewriteRule ^/([^/]+)/([^/]+)/(.*)$ test.php?name=$1&id=$2&nick=$3 [L,QSA]
# ^--- this slash
他のクエリ文字列パラメータはそのように保持されるため、QSAフラグに注意することもできます。
test.php
に書き換えると、このPHPプログラムは。htaccessファイルと同じディレクトリにあることに注意してください。存在しない場合、mod_rewriteモジュールが欠落しているエントリを検出し、ルールを自動的にバイパスするため、書き換えが行われない場合があります。その場合は、エラーログに表示されます。そうでない場合は、test.phpスクリプト名の前にパスを配置する必要があります。
RewriteRule ^/([^/]+)/([^/]+)/(.*)$ /test.php?name=$1&id=$2&nick=$3 [L,QSA]
# ^--- those slashes ---^
アクセスログとエラーログのコピーを取得して、Apacheが実際に何が間違っているかを確認する必要があることに注意してください。より多くの情報を取得するには、詳細度を上げる必要がある場合があります。
追伸この段落は逆になっているようです...質問を編集して修正できますか?
この
http://www.testdomain.com/test?name=john&id=2&nick=doe
をhttp://www.testdomain.com/test/john/2/doe
またはhttp://www.testdomain.com/john/2/doe
に書き換えたいです。
すべてをスクリプトにリダイレクトしてから、次のように処理する必要があります。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule (.+) index.php?url=$1 [QSA]
したがって、$_GET['url']
を/
で分解して、個々のパラメーターを取得できます。