2011-06-20 16 views
0

htaccessを使用してフラットリンクを書き直す際に問題が発生しています。完全にうまく動作する2つのルールセットがありますが、一緒にすると望ましくない影響があります。.HTACCESS MOD_REWRITE FLAT Links問題

最初のセクションには、スラッシュがない場合は後ろにスラッシュが追加され、301の転向でURLが書き換えられます。

第2は、すべての「フォルダ」をパラメータに変換し、特定の形式でphpに渡します。

ページに応じて不明なフォルダ数がありますので、コードを一般的なものにしておきたいと思います。

問題は、コード機能が機能します(つまり、phpに正しいパラメータが入力されています)が、URLが間違った形式で書き換えられるという問題です。

PHPコード:

<?php echo ‘<pre>’;print_r($_GET); echo ‘</pre>’;?> 

サンプルURL:(削除HTTP://質問ごとに2つのリンクに制限される)

localhost/foo/bar 

test.localhost/foo&other[]=bar/ 

に再書き込みされます出力:

Array 
(
    [p] => foo 
    [other] => Array 
     (
      [0] => bar 
     ) 
) 

あなたはhtaccessファイルの最初の部分を削除した場合、出力は同じで、URLが残る:

localhost/foo/bar 

はhtaccessファイル:

Options +FollowSymlinks 
RewriteEngine on 

SECTION 1:

RewriteCond %{REQUEST_URI} !.*/$ 
RewriteRule (.*)$ /$1/ [L,R=301] 

SECTION 2:

RewriteRule ^(.*)/([^/]+)/?$ $1&other[]=$2 [L] 
RewriteRule ^(?!index\.php)([^/]+)/?$ /index.php?p=$1 [L,QSA] 
+0

私はあなたがしたいことと何が問題なのかと混同しています。あなたはそれを明確にしてください - そのようなURLの1つまたは2つの例を提供してください:ブラウザでどのように見え、どのようにそれらをPHPスクリプト(書き換え)に送るかを指定してください。私が理解しているように、 'http:// example.com/foo/bar' =>' http:// example.com/foo/bar/'=> ???(PHPに送信される最終的なURL) – LazyOne

+0

http:// localhost/foo/barを変更しようとしているので、必要に応じてスラッシュが追加され、print_r $ _GETのときに配列があります[p] => foo [other] =>配列([0] => bar))。ローカルホストの後の最初の部分はpの値になり、残りはもう一方の配列に配置されます。これとは別に、元の投稿の条件/ルールは機能しますが、一緒に使用すると問題が発生します。これが明確になることを願って – 64k

答えて

0

代わりにこれらの行を試してみてください:/foo/bar/

Options +FollowSymlinks 
# Activate Rewrite Engine 
RewriteEngine on 
# Force trailing slash to be present (only if such file does not exist) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*[^/])$ /$1/ [R=301,QSA] 
# Rewrite rule to real php file (only if such folder does not exist) 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-z0-9\-_]+)/([a-z0-9\-_]+)/$ /index.php?p=$1&other[]=$2 [NC,QSA,L] 

に注意してください、最後の行は、この構造のURLのために動作します。 /foo/barとは動作しません(末尾のスラッシュを追加するための特別なリダイレクトルールがあるため、これは決して行われません)。/foo/bar/meow/のような長いURLもあります。最後の2行を複製して変更する必要があります。

また、URLに一致するフォルダ(たとえばfoo/bar/)がある場合、ルールはうまく機能しません。

これらのルールがテストされ、動作していることが確認されました。変更が必要な場合は教えてください。