私の 前の質問 の.htaccess
を使用して、/contact/
を/contact.php
に、/xyz/contact/
を/contact.php?lang=xyz
に書き換える書き換えルールを追加するように編集しました。 2つ目は機能しますが、1つ目はまだ存在しない実際のディレクトリを探し、404
コードを返します。ニースURLバリアントへの両方のリダイレクトは、期待どおりに機能します。これが私の.htaccess
設定です:
# No directory listing, no multi views, follow symlinks
Options -Indexes -MultiViews +FollowSymLinks
# Redirects and rewrites allowed
RewriteEngine on
# ...
# Redirect direct requests for "contact.php?lang=xyz" to "/xyz/contact/"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^lang=([a-z]{2,3})$
RewriteRule ^contact\.php$ /%1/contact/? [R=301,L]
# Redirect direct request for "contact.php" to "/contact/"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^contact\.php$ /contact/? [R=301,L]
# Internally rewrite "/xyz/contact/" to "/contact.php?lang=xyz"
RewriteRule ^([a-z]{2,3})/contact/?$ /contact.php?lang=$1 [L]
# ...
# Internally rewrite "/contact/" to "/contact.php"
RewriteRule ^/contact/?$ /contact.php [L]
# Internally rewrite "/contact/" to "/contact.php" RewriteRule ^/contact/?$ /contact.php [L]
ディレクトリごとの.htaccess
ファイルでは、RewriteRule
patternのスラッシュプレフィックスを削除する必要があります(以前のディレクティブで行ったように)。したがって、これは次のように書く必要があります。
RewriteRule ^contact/?$ /contact.php [L]
これは、/contact
および/contact/
の要求と一致します。
RewriteRule
patternではスラッシュプレフィックスは使用されません。これは、.htaccess
コンテキストでは、directory-prefix(特にスラッシュで終わるため) )は、最初にRewriteRule
patternが一致するURLパスから削除されます。 (directory-prefixは、.htaccess
ファイルが配置されている場所のファイルシステムパスです。)