web-dev-qa-db-ja.com

.jsp拡張子を削除してhtaccessのスラッシュに置き換える方法は?

URLから.jsp拡張子を削除して、スラッシュに置き換えます。 example.com/xyz.jspからexample.com/xyz/およびexample.com/xyz.jsp?ab=12からexample.com/xyz/?ab=12

私が使用した:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]

そして

RewriteEngine On
RewriteBase /

# external redirect from /example.html to /example
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+([^.]+)\.html [NC]
RewriteRule ^ /%1/ [R=301,L]

# internal forward from /example/ to //example.html
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^(.+?)/?$ /$1.html [L]

私の.htaccessで、しかしどちらも正しく動作していません。

2
Vaibhav Singh

Mod_rewriteディレクティブと競合する傾向があるため、これが正しく機能する前にMultiViewsが無効になっていることを確認する必要があります。これを.htaccessファイルに追加します。

Options +FollowSymLinks -MultiViews

FollowSymLinksはmod_rewriteが機能するために有効にする必要があるため、念のため。)

次に、すでに持っているもののようなものが合理的に見えます:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/$1.jsp -f
RewriteRule (.+)/$ $1.jsp [L]

URLの末尾にスラッシュを必須にしました(そうしないと、同じコンテンツにアクセスする2つのURLが存在する可能性があります-重複コンテンツ)。

PDATE:リクエストを.jsp URLに正規URLにリダイレクトするには(つまり、拡張子なしで末尾にスラッシュを付けて)、次のようなもの(あなたが持っていたものに似ています)質問)上記のディレクティブの前に行く必要があります:

RewriteCond %{THE_REQUEST} \.jsp\s
RewriteRule (.+)\.jsp$ /$1/ [R=301,L]

これは、.jsp URLがインデックス付けされているか、外部にリンクされている場合にのみ必要です。これが新しいサイトの場合、この手順はオプションです。

キャッチするよりも、RewriteRulepattern(つまり(.+)\.jsp$)でできるものと一致させる方が効率的です。 -ここにすべての正規表現。 THE_REQUEST条件は、これが最初のリクエストにのみ適用され、書き換えられたリクエストには適用されないことを保証します。これにより、リダイレクトループが防止されます。

したがって、要約すると:

# Disable MultiViews
Options +FollowSymLinks -MultiViews

RewriteEngine On

# Remove file extension from URLs (external redirect)
RewriteCond %{THE_REQUEST} \.jsp\s
RewriteRule (.+)\.jsp$ /$1/ [R=301,L]

# Internally rewrite extensionless URLs back to ".jsp"
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/$1.jsp -f
RewriteRule (.+)/$ $1.jsp [L]

DEBUGGING:上記のデバッグを支援するには、RewriteEngine Onディレクティブの下に次のディレクティブを追加し、サーバーの環境変数(MOD_REWRITE_THE_REQUESTおよびMOD_REWRITE_URL_PATH)を確認します-サイドコード:

RewriteCond %{THE_REQUEST} (.*)
RewriteRule (.*) - [E=MOD_REWRITE_THE_REQUEST:%1,E=MOD_REWRITE_URL_PATH:$1]

.jsp URLにアクセスするとき、これらの環境変数には何が含まれますか?

1
MrWhite