0

.htaccessに次のコードがあります

 Options +FollowSymLinks 
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(/([^/]+))?(/(edit)+)(/([^/]+))?/?$ edit.php?secret=Y7qD7&category=$1&slug=$3&edit=$5&part=$7 [L]
RewriteRule ^([^/]+)(/([^/]+))?/?$ content.php?category=$1&slug=$3 [L]
RewriteRule ^(/)?$ content.php [L]

私が達成することを期待しているのは

http://example.com/test/test1/edit/part   to  edit.php?category=test&slug=test1&edit=edit&part=part
http://example.com/test/edit/part   to  edit.php?category=test&slug=&edit=edit&part=part

(上記の書き換えは期待どおりに機能しています)

 `http://example.com/test/test/` to `content.php?category=test&slug=test` 
 `http://example.com/test/` to `content.php?category=test&slug=`

(上記の2つのURLには「/edit/」と「/part/」がないことに注意してください)

上記の2回の書き換えでは、最初の書き換えは正常に機能していますが、2番目の書き換えは期待どおりに機能していません。最後のものはcontent.php?category = content.php&slug=に書き直されますがこれは正しくありません。

また、末尾のスラッシュは書き換えに違いをもたらさないはずです。

誰かが私がここで間違っていることを教えてくれませんか?

4

1 に答える 1

1

質問のルールが期待どおりに機能しない理由を確認しませんでしたが、代わりにこれを試すことができます。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  ^/([^/]+)/?([^/]*)?/?([^/]*)?/?([^/]*)?/?
RewriteRule .*    edit.php?key1=%1&key2=%2&key3=%3&key4=%4     [L]

静かにマップ:

http://example.com/val1/まで

http://example.com/val1/val2/val3/val4/末尾のスラッシュの有無にかかわらず

に:

http://example.com/edit.php?key1=val1&key2=val2&key3=val3&key4=val4

受信URLで渡される値の最大数valNは4です。最小数は1です。ただし、その範囲はルールを変更して調整できます。

着信URLに存在しないものvalNがある場合、置換URLに追加されたクエリの対応するキーと値のペアの値は空になります。

ただし、すべてが着信URLによって渡されない固定文字列であるため、keyは常にクエリに存在します。keys

このルールセットはテストされ、機能しているため、競合する可能性のある他のルールなしでテストする必要があります。私は質問の他のルールをチェックしなかったし、それらが機能するかどうか、またはそれらがこのルールに影響を与える可能性があるかどうかを言うことはできません。それは質問の一部ではありませんでした。

アップデート

edit.phpへのリダイレクト:

edit.phpへのマッピングは、URLパスに3つまたは4つのフォルダーがある場合にのみ必要です。

変更されたルールセットは次のとおりです。

RewriteEngine On
RewriteBase /
    
RewriteCond %{REQUEST_URI} !edit\.php  [NC]
RewriteCond %{REQUEST_URI}  ^/([^/]+)/([^/]+)/([^/]+)/?([^/]*)?/?$  [NC]
RewriteRule .*    edit.php?key1=%1&key2=%2&key3=%3&key4=%4     [L,QSA]

静かにマップ:

http://example.com/val1/val2/val3/まで

http://example.com/val1/val2/val3/val4/末尾のスラッシュの有無にかかわらず

に:

http://example.com/edit.php?key1=val1&key2=val2&key3=val3&key4=val4

着信URLで渡されるvalN値の最大数は4です。最小数は3です。


content.phpへのリダイレクト:

content.phpへのマッピングは、フォルダーの数が1または2の場合にのみ行われることを除いて、前のものと非常に似ています。

したがって、ルールセットは基本的に同じですが、正規表現グループは少なくなります。

RewriteCond %{REQUEST_URI} !content\.php  [NC]
RewriteCond %{REQUEST_URI}  ^/([^/]+)/?([^/]*)?/?$  [NC]
RewriteRule .*    content.php?key1=%1&key2=%2   [L,QSA]

静かにマップ:

http://example.com/val1/ まで

http://example.com/val1/val2/末尾のスラッシュの有無にかかわらず

に:

http://example.com/content.php?key1=val1&key2=val2

着信URLで渡されるvalN値の最大数は2です。最小数は1です。

完全なルールセットは次のようになります。

Options +FollowSymLinks 
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !edit\.php  [NC]
RewriteCond %{REQUEST_URI}  ^/([^/]+)/([^/]+)/([^/]+)/?([^/]*)?/?$ [NC]
RewriteRule .*    edit.php?key1=%1&key2=%2&key3=%3&key4=%4  [L,QSA]

RewriteCond %{REQUEST_URI} !content\.php  [NC]
RewriteCond %{REQUEST_URI}  ^/([^/]+)/?([^/]*)?/?$  [NC]
RewriteRule .*    content.php?key1=%1&key2=%2   [L,QSA]

私があなたが欲しいものを理解したことを願っています。

于 2013-02-04T19:57:43.003 に答える