2017-02-11 13 views
1

まず、達成しようとしているもの: ベースhttp://example.com/subdirでテストしています。これはすべてのサブフォルダ、index.php、および.htaccessの場所です。 (余分なルールを削除)の.htaccessに示すようhtaccess:相対パスが正しく動作しない

私はルールの3つのグループがあります。

<IfModule mod_rewrite.c> 
Options +FollowSymlinks 
RewriteEngine on 

# Convert item/edit/xx -> index.php?p=edit&id=xx 
# Convert item/remove/xx -> index.php?p=remove&id=xx 
#RewriteCond %{REQUEST_URI} ^/item [NC] 
#RewriteCond %{QUERY_STRING} ^id=([0-9]+)$ [NC] 
RewriteRule ^item/([a-z]+)/([0-9]+)$ index.php?p=$1&id=$2 [NC,L] 

# Convert category/yyyy -> customer/pagination.php?category=yyyy 

#RewriteCond %{QUERY_STRING} category=([a-zA-Z\s]+)$ 
RewriteRule ^customer/category/([a-zA-Z\s]+)$  customer/pagination.php?category=$1 [NC,L] 


# Convert action/about -> index.php?p=about 
# Convert action/terms -> index.php?p=terms 


#RewriteCond %{QUERY_STRING} p=([a-z]+)$ 
RewriteRule ^action/([a-z]+)$  index.php?p=$1 [NC,L] 

</IfModule> 

私はそれがコメントしているのでするRewriteCondは、(与えパスが見つかりません)働いていなかった直面した最初の問題すぐに外に出てください。 RewriteRuleは絶対パスで正常に動作します(例:RewriteRule^action /([az] +)$ http://example.com/subdir/index.php?p= $ 1 [NC、L])しかし、これによりブラウザに実際のURLが表示されるため、パス。 最初のリダイレクト後、左のリンクの最初の部分がパスに追加されます。つまり、アクション/約リンクをクリックした後にhttp://example.com/subdirhttp://example.com/subdir/actionになります。 RewriteBaseを定義するか、URLにスラッシュを付けると状況が悪化します。 私の問題の根本的な原因を突き止めることができる鷲の目を持つ専門家に感謝します。

+0

私は本当にあなたの質問の第2部分を理解していません。エラーの原因となるURLの例と、リダイレクトするパスと、実際にリダイレクトされるパスは何ですか? – Anonymous

+0

例のURLはhttp://example.com/subdir/action/aboutです。クリックすると、[About]ページにリダイレクトされますが、次のリクエストのパスはhttp://example.com/subdir/action/になります。したがって、アクション/用語のリンクをクリックすると、結果のurl = http://example.com/subdir/action/action/termsとなります。余分な「アクション」フォルダがパスに追加されていることに注意してください(http://example.com/subdir/index.php?p=termsにリダイレクトする必要があります)。すべてのリンクは相対BTWです(例:アクション/約。ありがとうございました。 – user2097141

答えて

1

最初の問題は、%{REQUEST_URI}には常にフルパスが含まれていることです。第二の問題は、実際の.htaccessを使用して解決されない

RewriteCond %{REQUEST_URI} ^/subdir/item [NC] 

:だから、あなたの条件に変更することができます。ブラウザにあなたが望むものを伝えるだけです。したがって、2つの方法のいずれかを使用できます。

<a href="terms">Click here</a> 

<base href="/subdir" /> 
  • がブラウザに表示されるURLへの相対パスを使用します。

    1. は(ページ上のすべての相対URIに適用されます)<base>要素を使用します

    本当に問題を解決したい場合は.htaccessを使用すると、これを行う本当の唯一の方法は、要求された後に複製されたディレクトリを削除することです。

  • +1

    多くのおかげで、を設定すると助けになりましたが、PHPのすべてのヘッダーリダイレクトを絶対パスに変更してすべてのリンクを機能させる必要がありました。私は#RewriteCond%{QUERY_STRING}^id =([0-9] +)$ [NC]を得た後に完全なコードを投稿します。 – user2097141

    関連する問題