web-dev-qa-db-ja.com

mod_rewriteはルートではなくディレクトリ内で動作します

クエリ文字列部分のRewriteRuleに問題があります。私がデバッグできるのは、少なくとも「tags.php」ページがレンダリングされているが、URLパラメーターがないため、ルールがトリガーされていることです。ルールを含むこの.htaccessファイルは、私のサブドメインのルートフォルダー内にあり、次のコンテンツが含まれています。

# Enable Rewriting  
RewriteEngine on  

# Rewrite rule for tags
RewriteRule ^tags/(\w+)/(\d+)/?$ tags.php/?tag_name=$1&tag_id=$2 [L]
RewriteRule ^tags/(\w+)/?$ tags.php?tag_name=$1    [L]
RewriteRule ^tags/?$ tags.php?tag_name= [L]

同様の.htaccessファイルがサブドメイン内のディレクトリに存在しますが、必要なURLパラメータも利用可能で、期待どおりに動作しています。ディレクトリ内の.htaccessファイルは次のように読み取ります。

# Rewrite rule for tags
RewriteRule ^tags/(\w+)/(\d+)/?$ restAPI.php?type=tags&tag_name=$1&tag_id=$2     
RewriteRule ^tags/(\w+)/?$ restAPI.php?type=tags&tag_name=$1    
RewriteRule ^tags/?$ restAPI.php?type=tags&tag_name=

RewriteRulesの問題を誰でも見ることができますか?また、Internal Server Errorに直面しています。これは、同じ問題が原因で2番目に推測されることもあります。

共有ホスティングにApacheバージョン2.2.23があります。

更新

私は次のフォルダ構造を持っています
/サブドメインルート
|-.htaccess
|-tags.php
|-article.php
|-index.php
|-画像とJavaScriptのフォルダー

Schwarzbrotが示唆するように、 'tags.php'に関連付けられている書き換えルールも変更しようとしましたが、驚いたことに、存在しないファイルにリンクしていましたエラーは出ませんでした。

2
Anvesh Saxena

ここではさまざまな原因が考えられます。セットアップ(フォルダーレイアウト、仮想ホスト構成、および特に.htaccessファイルの他のコンテンツ)について詳しく知っていると役立ちます。私の頭に浮かぶいくつかのこと:

Eric Brandelが指摘しているように、mod_rewriteは、[L]を使用して処理を停止しない限り、.htaccessファイル(またはサーバー構成)に存在するallルールを1つずつ適用します。したがって、書き換えられたURLは、ページが最終的にレンダリングされる前に、.htaccessファイル内の後続のRewriteRules(何かありますか?)によって再び変更される可能性があります。この場合、3行すべての最後に[L]を使用するだけで問題を解決できます。

異なるサブドメインのフォルダーが相互に配置されている状況では、mod_rewriteに現在のパスがルートレベルにあることを明示的に通知する必要があります。そうしないと、ルールがトリガーされません。

RewriteBase /

これが役に立たない場合は、mod_rewriteがトリガーされるかどうかを確認することをお勧めします。次のような非常に単純なリダイレクトルールを使用します。

RewriteRule .* /?hello [R,L]

理由:tags.phpのレンダリングがmod_rewriteによるものではなく、/ tagsが呼び出されたときにApacheが拡張子.phpを自動的に追加する可能性さえあります( こちらを参照 )。仮想ホストごとに個別にアクティブ化する必要があるため、mod_rewriteをオンにするには RewriteEngine On を使用する必要があります。サブドメインでまだアクティブになっていない可能性があります。

現在どのルールがトリガーされているかわからない場合は、たとえばルールを一時的に書き換えではなくリダイレ​​クトに変える:

RewriteEngine On
RewriteBase /
RewriteRule ^tags/(\w+)/(\d+)/?$  tags.php?tag_name=$1&tag_id=$2 [R,L]
RewriteRule ^tags/(\w+)/?$ tags.php?tag_name=$1 [R,L]
RewriteRule ^tags/?$ tags.php?tag_name= [R,L]

Edit:これにより、スクリプトが同じ名前の場合にサーバーがルールをトリガーできなくなるため、フォルダー名として「タグ」を保持できます。 :

Options -Multiviews

(別の例については https://stackoverflow.com/questions/444592/mod-rewrite-rules-and-content-negotiation を参照)

2
schwarzbrot

.htaccessを使用すると、リクエストが複数のルールに一致する場合、処理を停止するように指示しない限り、最後に見つかったルールが使用されます。それには、[PT、L]を各行の最後に追加します。

# Rewrite rule for tags
RewriteRule ^tags/(\w+)/(\d+)/?$ restAPI.php?type=tags&tag_name=$1&tag_id=$2  [PT,L]
RewriteRule ^tags/(\w+)/?$ restAPI.php?type=tags&tag_name=$1 [PT,L]
RewriteRule ^tags/?$ restAPI.php?type=tags&tag_name= [PT,L]

PTフラグ: http://httpd.Apache.org/docs/current/rewrite/flags.html#flag_pt

Lフラグ: http://httpd.Apache.org/docs/current/rewrite/flags.html#flag_l

[PT、L]はやり過ぎかもしれないと思いますが、よく使われるのを見てきました。私の意見では、それは明確さを追加します。 [PT]を単独で使用すると動作する場合があります。

2
Eric Brandel

問題を解決しました。エリック・ブランデルが示唆したように、tag_nametag_idas

RewriteRule ^test/(\w+)/(\d+)/?$  tags.php?tag_name=extra&tag_id=4

そして、クエリパラメータを取得し、RewriteRulesを

# Rewrite rule for tags
RewriteRule ^tag/(\w+)/(\d+)/?$  tags.php?tag_name=$1&tag_id=$2 [L]
RewriteRule ^tag/(\w+)/?$ tags.php?tag_name=$1    [L]
RewriteRule ^tag/?$ tags.php?tag_name= [L]

uRIのtags /tag /に変更して、私の問題解決されました。 tags.phpへのすべてのクエリパラメータの取得を開始しました。
それで、シュワルツブロートが示唆したように、 コンテンツネゴシエーション の問題があったようです。
この厄介な問題を解決するための貴重なフィードバックをいただいたEric Brandel、schwarzbrot、およびw3dに感謝します。

1
Anvesh Saxena