4

私はこれを2時間以上解決しようとしています。.htaccess を使用して URL を管理する個人サイトがあります。次のようになります。

RewriteEngine on
RewriteBase /
...
RewriteRule ^sklad/?$ index.php?action=sklad
RewriteRule ^sklad/user/([0-9]+)?$ index.php?action=sklad&user=$1
RewriteRule ^sklad/folder/(.+)?$ index.php?action=sklad&folder=$1
RewriteRule ^sklad/file/(.+)?$ engine/ajax/sklad.php?file=$1
RewriteRule ^sklad/logout/?$ index.php?action=sklad&op=logout
...
RewriteRule ^admin/?$ admin.php
RewriteRule ^admin/news/?$ admin.php?action=news

最初の 5 つは問題なく動作します。admin/ one は正常に動作します。しかし、admin/news/にアクセスしようとすると、空白のページが表示されます。Apache によって表示またはログに記録されるエラーはなく、出力もありません。admin.php?action=newsは正常に動作しています。

sklad/フォルダーとadmin/フォルダーの両方がサーバー上に物理的に存在します。しかし、admin/フォルダーの名前を別の名前に変更するか、最後のRewriteRuleを次のように変更すると

RewriteRule ^admin123/news/?$ admin.php?action=news

admin123/news/にアクセスできます。サーバー上に存在する実際のフォルダーと関係がある場合、最初の 5 つのルールが機能するのはなぜですか? これは意味がありません。

私はアイデアがありません。ここの誰かが助けてくれることを願っています...

4

2 に答える 2

2

はい、news.php という名前です... ファイルの名前を変更したところ、問題なく動作しました。このことを知らなかった、かなり目立たないバグ (またはそうでない?)

これはバグではありません。コンテンツ ネゴシエーション (mod_negotiation 経由) がオンになっていて、望ましくないことを行っているようです。ネゴシエーションは、タイプ マップまたはMultiViewsオプションを介してオンにすることができます。タイプマップはセットアップが少し明示的であるため、なぜこれが起こっているのかわからないので、にマップする特定のタイプを設定していないと思いますnews.php。したがって、おそらくマルチビューがオンになっています。Optionsステートメントから削除することで、オフにすることができます。

#  remove this word -----------v
Options Indexes FollowSymLinks Multiviews

これは、htaccess、サーバー構成、vhost構成、一部の構成インクルードファイルなどのどこにでもある可能性があります。したがって、htaccessファイルで明示的に設定解除することもできます(同じファイルで明示的に設定していない限り)。 :

Options -Multiviews
于 2012-11-05T09:54:46.393 に答える
0

私は htaccess と RegExp が苦手ですが、admin/news は最初の htaccess ルールに当てはまると思います。

   RewriteRule ^admin/?$ admin.php

次の管理者の 2 番目のルールでは続行されません。

   RewriteRule ^admin/news/?$ admin.php?action=news

私が以前に直面していたのと同じ問題です。

params パスがない場合は、admin.php を変更して、何かを echo/print してみてください。このようなもの:

   if($_GET['action'])
   {
        echo 'With Parameters';
   }
   else
   {
       echo 'No Parameters pass';
   }

そのようにデバッグしました。

于 2012-11-05T03:48:24.983 に答える