web-dev-qa-db-ja.com

Apache URLの書き換えが機能しない

以下の書き換えを行う前に、すべての.phpファイルが書き換えられます。

test.php => test
foo.php => foo

このhttp://www.testdomain.com/test?name=john&id=2&nick=doehttp://www.testdomain.com/test/john/2/doeに書き換えたいです。

testはインデックスファイルです。

私はこれらのメソッドを書き換えようとしました:

  1. 方法1:

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/([^/]+)/(.*)$ test?name=$1&id=$2&nick=$3 [L,QSA]
    
  2. 方法2:

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/([^/]+)/(.*)$ test.php?name=$1&id=$2&nick=$3 [L,QSA]
    
  3. 方法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は有効のままではありません)!何が間違っていますか?

3
CS GO

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]
2
PatomaS

私は同様のルールを持っていました、これを試してください:

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
0
Nicoli

あなたの「方法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=doehttp://www.testdomain.com/test/john/2/doeまたはhttp://www.testdomain.com/john/2/doeに書き換えたいです。

0
Alexis Wilke

すべてをスクリプトにリダイレクトしてから、次のように処理する必要があります。

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule (.+) index.php?url=$1 [QSA]

したがって、$_GET['url']/で分解して、個々のパラメーターを取得できます。

0
user550