web-dev-qa-db-ja.com

mod_spelingをマルチレベルのhtaccessとrewriterulesで使用する

最近、301を管理するための形式を切り替えました。ほとんどの場合、すべてがうまくいきましたが、mod_spelingが適切に動作しなくなったようです。変更点は次のとおりです。

古い/var/www/html/.htaccess

RewriteEngine on
RewriteBase /

# Change SHTML to HTML
RewriteRule ^(.*)\.shtml$ $1.html [R=permanent,L]

# Change PCF to HTML ('cause, you know, we probably have CMS users like that...)
RewriteRule ^(.*)\.pcf$ $1.html [R=permanent,L]

# Force WWW subdomain for all requests
RewriteCond %{HTTP_Host} !^www.example.edu$ [NC]
RewriteRule ^(.*)$ http://www.example.edu/$1 [R,L]

# User accounts are on Sun.example.edu
RedirectMatch ^/~(.*)$ http://Sun.example.edu/~$1

# Remove index.html at the end of URLs
RewriteCond %{REQUEST_URI} ^(.*/)index\.html$ [NC]
RewriteRule . %1 [R=301,NE,L]

Redirect 301 /academics/calendar2012-13.html http://www.example.edu/academics/calendar.html
Redirect 301 /academics/departments/   http://www.example.edu/majors/
Redirect 301 /academics/Pre-Medical.pdf http://www.example.edu/academics/Pre-Medicine.pdf
Redirect 301 ...

新しい/var/www/html/.htaccess

RewriteEngine on
RewriteBase /

# Change SHTML to HTML
RewriteRule ^(.*)\.shtml$ $1.html [R=permanent,L]

# Change PCF to HTML ('cause, you know, we probably have CMS users like that...)
RewriteRule ^(.*)\.pcf$ $1.html [R=permanent,L]

# Force WWW subdomain for all requests
RewriteCond %{HTTP_Host} !^www.example.edu$ [NC]
RewriteRule ^(.*)$ http://www.example.edu/$1 [R,L]

# User accounts are on Sun.example.edu
RedirectMatch ^/~(.*)$ http://Sun.example.edu/~$1

# Remove index.html at the end of URLs
RewriteCond %{REQUEST_URI} ^(.*/)index\.html$ [NC]
RewriteRule . %1 [R=301,NE,L]


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) 404/$1

そして、/var/www/html/404/.htaccessに新しいファイルを追加しました。

RewriteEngine on
RewriteBase /404

RewriteRule ^academics/calendar2012-13.html$    /academics/calendar.html    [R=302,L]
RewriteRule ^academics/departments/$    /majors/    [R=301,L]
RewriteRule ^academics/Pre-Medical.pdf$ /academics/Pre-Medicine.pdf[R=301,L]
RewriteRule ...

Httpd.confへの(Webminベースの)アクセスがあります(可能な場合、301をすべて格納する必要はありません)。独自のデータセンターのサーバー上のRHEL 6でApache 2.2.15を実行しています。

私が言ったように、私たちが見ている唯一の問題はmod_spelingがもはやその魔法をしていないということです。新しいフォーマットには、古いものよりも多くの利点があり、私たちは本当に戻りたくありませんが、mod_spelingは非常に良いので、可能であれば機能することを本当に望んでいます。 mod_spelingを修正する方法についてのアイデアはありますか?

3
michaelcgorman

mod_spelingとmod_rewriteは、同じフェーズでルールを適用します。書き換えがURLに触れた場合、通常はmod_spelingにURLを渡しません。 mod_spelingの魔法の実行を妨げている書き換えルールでは、「パススルー」[PT]フラグを使用できます。 [PT]フラグが設定されている場合、mod_spelingは引き続きその役割を果たします。

もう1つ、404ハンドラー用のスクリプトを配置します。これにより、スクリプト内のURLを調べて、大文字と小文字の区別、推測可能な切り捨て、「。html」の後に追加される文字などのルールに基づいてリダイレクトを発行できます。私が実際に得ていた404エラーでより良い仕事をした404ハンドラを実装できるとわかったとき、mod_spelingの使用をやめました。

1