クエリ文字列部分の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'に関連付けられている書き換えルールも変更しようとしましたが、驚いたことに、存在しないファイルにリンクしていましたエラーは出ませんでした。
ここではさまざまな原因が考えられます。セットアップ(フォルダーレイアウト、仮想ホスト構成、および特に.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 を参照)
.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]を単独で使用すると動作する場合があります。
問題を解決しました。エリック・ブランデルが示唆したように、tag_nameとtag_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に感謝します。