2

私はこれで何時間も働いてきましたが、それに関する情報を見つけることができません。そうですね、情報はありますが、組み合わせて機能しない個別のソリューションしか見つけることができません。

私はこれから始めようとしています:

RewriteCond %{REQUEST_URI} \.(php)$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.example.com/$1/ [L,R=301]

コードが機能し、末尾のスラッシュが表示されます。しかし、存在しないファイル名を入力すると、301 が返されます。例:

http://www.example.com/thisfiledoesnotexist.php

最初のヘッダー応答は 301 であり、次の値を返そうとするため、論理的です。

http://www.example.com/thisfiledoesnotexist.php/

そして 404 を返しますが、この方法では 404 を返すのに 2 つのリクエストが必要です。

多くの人が以前にこの問題を発見したと思います。これは一般的な問題だと思いますが、解決策は見つかりませんでした。

4

2 に答える 2

2

チェックを使ってみて-fください。リクエストが既存のファイルに対するものかどうかを確認します。

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.(php)$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.example.com/$1/ [L,R=301]
于 2012-12-28T03:21:17.620 に答える
1

最後に私は解決策を得ました!!! それは単純ではなく、私はそれがどのように機能するのか本当に理解していません。このページにある Adam Dimech のコードを試してみました。

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

RewriteEngine on

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

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^/]+/)*[^.]+\.php(\?[^\ ]*)?\ HTTP/
RewriteRule ^(([^/]+/)*[^.]+)\.php$ http://www.example.com/yourdirectory/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ http://www.example.com/yourdirectory/$1/ [R=301,L]

このコードは、作業する各ディレクトリに配置する必要があります。相対パスを使用する場合は、使用する必要があります

コードは素晴らしく機能しました。これで、php 拡張機能を削除して、末尾のスラッシュを強制できます。より多くの人に役立つことを願っています!

于 2012-12-28T15:17:01.277 に答える