0

404 not found エラーが発生した場合に 404 カスタム ページにリダイレクトするための基本的なコードがありますが、これが常に期待どおりに機能するとは限りません。page/foo/barまた、リダイレクト先の URL を書き換えるルールもあります。page.php?var1=foo&var2=bar

このルールは次のとおりです。

<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule .* - [L]
    RewriteRule ^page/(.*)/(.*)$ page.php?var1=$1&var2=$2 [L]
</IfModule>

したがって、これは非常にうまく機能し、2 つの変数を取得できます。ただし、URLバーに書き込むpage/aと、メッセージとともにエラーがスローされます500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.。メッセージは、エラーはErrorDocumentルールが原因であると言っています。存在しない URL を入力するとErrorDocument機能しますが、この特定のケースでは機能しません。

page/aまた、書く代わりにI write を書くpage/a/と、エラーが消えることにも言及したいと思います。そのため、エラーがスローされるのは URL のみで/.

他の既存のページなどについてはaboutcontacts簡単に配置または削除でき/.htaccess自動的に正しいページにリダイレクトされます。/

これは、拡張子を削除して URL を変更するコードです。/

# ------------------------------------------------------------------------------
# | Remove the slash                                                           |
# ------------------------------------------------------------------------------
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/$ $1 [R=301,L]
</IfModule>

# ------------------------------------------------------------------------------
# | Redirect to extensionless url                                              |
# ------------------------------------------------------------------------------
<IfModule mod_rewrite.c>
    RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
    RewriteRule ^(.+)\.php$ $1 [R=301,L]
</IfModule>

ErrorDocument のコードは次のとおりです。

ErrorDocument 404 /boilerplate/template/404.php

最後に、Apache エラー ログのメッセージ:

[core:error] [pid 4400:tid 1672] [client ::1:65310] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.  

編集

これが書き換えに関する全体の部分です

# ##############################################################################
# # URL REWRITES                                                               #
# ##############################################################################
# ------------------------------------------------------------------------------
# | Rewrite engine                                                             |
# ------------------------------------------------------------------------------


<IfModule mod_rewrite.c>
    Options +FollowSymlinks
  # Options +SymLinksIfOwnerMatch
    RewriteEngine On
 RewriteBase /boilerplate
</IfModule>


# ------------------------------------------------------------------------------
# | Remove the slash                                                           |
# ------------------------------------------------------------------------------
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/$ $1 [R=301,L]
</IfModule>

# ------------------------------------------------------------------------------
# | Redirect to extensionless url                                              |
# ------------------------------------------------------------------------------
<IfModule mod_rewrite.c>
    RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
    RewriteRule ^(.+)\.php$ $1 [R=301,L]
</IfModule>

# ------------------------------------------------------------------------------
# | Pretty urls                                                                |
# ------------------------------------------------------------------------------
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule .* - [L]
    RewriteRule ^about/([^/]+)(?:/([^/]*))?/?$ about.php?var1=$1&var2=$2 [L,NC,QSA]
</IfModule>

<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php [L]
</IfModule>

編集2

.htaccessそこで、これらのいくつかのルールを除いてすべてを削除しました。何も変わっていません。Cookie を消去し、キャッシュを空にし、すべてのブラウザー履歴を消去しました。また、他のブラウザで試してみましたが、同じことが起こります。明確にするために、私は別の.htaccessファイルを持っておらず、元のファイルには、キャッシュ、圧縮、その他の書き換えに関連しないものなど、HTML5 Boilerplate からの他のスニペットが含まれています。ここで、ファイルをこれらの数行まで削除しました。

    Options +FollowSymlinks
    Options +SymLinksIfOwnerMatch
    RewriteEngine On
    RewriteBase /boilerplate

# ------------------------------------------------------------------------------
# | Redirect to extensionless url                                              |
# ------------------------------------------------------------------------------

    RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
    RewriteRule ^(.+)\.php$ $1 [R=301,L]


# ------------------------------------------------------------------------------
# | Pretty urls                                                                |
# ------------------------------------------------------------------------------

    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule .* - [L]
    RewriteRule ^page/([^/]+)(?:/([^/]*))?/?$ page.php?var1=$1&var2=$2 [L,NC,QSA]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php [L]
4

1 に答える 1

1

ページ ルールを次のように置き換えます。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^page/([^/]+)(?:/([^/]*))?/?$ page.php?var1=$1&var2=$2 [L,NC,QSA]
于 2013-11-04T18:46:38.117 に答える