web-dev-qa-db-ja.com

Apache-/ contact /を/contact.phpに書き換える必要があります

私の 前の質問.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]
4
Polda18
# Internally rewrite "/contact/" to "/contact.php"
RewriteRule ^/contact/?$ /contact.php [L]

ディレクトリごとの.htaccessファイルでは、RewriteRulepatternのスラッシュプレフィックスを削除する必要があります(以前のディレクティブで行ったように)。したがって、これは次のように書く必要があります。

RewriteRule ^contact/?$ /contact.php [L]

これは、/contactおよび/contact/の要求と一致します。

RewriteRulepatternではスラッシュプレフィックスは使用されません。これは、.htaccessコンテキストでは、directory-prefix(特にスラッシュで終わるため) )は、最初にRewriteRulepatternが一致するURLパスから削除されます。 (directory-prefixは、.htaccessファイルが配置されている場所のファイルシステムパスです。)

7
MrWhite