0

I have the following rules in .htaccess file placed at the root folder

RewriteEngine on

RewriteRule ^/?$ /testsite/index.php?rel=m
RewriteRule ^about/?$ /testsite/aboutus.php?rel=b
RewriteRule ^ict/?$ /testsite/ict.php?rel=b
RewriteRule ^eeap/?$ /testsite/eeap.php?rel=b

The rule for index works fine with or without a trailing slash. However when I hit http://mydomain.com/testsite/about/ the page is served without CSS and images and works fine if the last slash is removed. This happens with the rule for ict too.

For the next rule (eeap) things behave the other way. CSS and images go missing if I end the URL with a slash.

What am I doing wrong here?

4

1 に答える 1

2

これについては、Web ブラウザーの観点から考える必要があります。

URL が「/about」などのスラッシュで終わらない場合、Web ブラウザは Web サーバーの最上位ディレクトリにある「about」というファイルを見ていると想定します。そのため、"/about" によって生成されたページ内の相対パスを持つ要求により、Web ブラウザーは最上位ディレクトリからの開始に基づいて完全なパスを生成します。たとえば、CSS ファイル パスが「css/style.css」の場合、ブラウザはトップレベルから開始し、「/css/style.css」からファイルを要求します。

しかし、URL がスラッシュ (この例では "/about/") で終わっている場合、Web ブラウザーは "about" というサブディレクトリを見ていると認識します。同じ CSS ファイル パス "css/style.css" により、Web ブラウザーは "/about/css/style.css" からのファイルを要求します。

一方の CSS ファイル パスは正しく、もう一方は正しくありません。したがって、あなたが見ている行動。

これを回避するにはいくつかの方法があります。すべてのリクエストをスラッシュで終わる URL またはスラッシュでない URL に永続的にリダイレクトするように Apache に指示できます。これにより、すべての訪問者が同じ URL を見ることになります。これにより、Web ページで使用する CSS と画像の相対パスを知ることができます。

または、Web ページを変更して、CSS、画像、JavaScript などのすべてのファイル パスが最上位ディレクトリに固定されるようにすることもできます。たとえば、「css/style.css」は「/css/style.css」になります (パスの先頭にあるスラッシュに注意して、ブラウザに最上位ディレクトリから開始するように指示してください)。

または、複雑な mod_rewrite ルールを多数追加して、CSS ファイルなどで考えられるすべての結果をキャッチしようとすることもできます。通常、ルールセットがより脆弱で複雑になるため、このアプローチは好みません。

于 2013-07-02T13:00:44.610 に答える