web-dev-qa-db-ja.com

.htaccessを使用してURLからディレクトリと.php拡張子を削除する

私はWordpress Webサイトを実行していますが、wordpress CMSに関連しないいくつかのフォルダがありますが、すべてのWordpressフォルダがあります。

ルートの.htaccess WPフォルダには標準スクリプトがあります:

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Wordpress CMSは完全に機能しています。これでcompaniesという名前のフォルダーができました。そのフォルダー内に、会社名を持つ他の多くのサブディレクトリがあります。 。毎日作成されるフォルダーが増えるため、この問題の現在のURLは次のとおりです。

www.example.com/companies/company-name/employee.php

これの私の目標は

www.example.com/company-name/employee

.php拡張も削除します)。

これを達成する方法は?

ルートフォルダーの.htaccessを変更してみました。最良の結果は、目的のリンクを機能させることができましたが、WordPressサイト全体で、すべての画像が読み込まれませんでした。 。

companiesフォルダ内に新しい.htaccessを作成する必要がありますか?新しいフォルダに毎回新しい.htaccessファイルを作成してもかまいません(これを機能させるために必死です)。

2
Newbie187

「companies」フォルダ内に新しい.htaccessを作成する必要がありますか?

いいえ。URLから/companiesディレクトリを非表示にするには、親ディレクトリの.htaccessファイルを変更する必要があります。すなわち。ドキュメントルートのWordPress .htaccessファイル。

/ companies内にCSSファイルといくつかの画像があります

そのため、言及された「従業員」のURLだけでなく、すべてのURLから/companiesを削除するつもりだと思います。

WordPressとの競合を回避するために、リクエストされているリソースが/companiesディレクトリに存在するかどうかを最初にテストする必要があります。その場合は、要求を書き直してください。それ以外の場合は、リクエストがWordPressに渡されるようにします。

ルート.htaccessファイル内の既存のWordPressディレクティブ、before)のようなものを試してください:

Options -MultiViews

# Any requests for /companies directly are ignored
# This includes rewritten requests (below)
RewriteRule ^companies/ - [L]

# Check if the requested resource exists in the /companies subdirectory.
# If so, rewrite the request to that subdirectory.
RewriteCond %{DOCUMENT_ROOT}/companies/$1 -f
RewriteRule (.+\.(css|js|png|jpg|gif))$ /companies/$1 [L]

# Check if the requested PHP file exists in the /companies subdirectory
# if requesting a URL that does not already have a file extension.
# NB: Assumes the URL-path does not otherwise contain dots.
# If so, rewrite the request to that subdirectory appending ".php"
RewriteCond %{DOCUMENT_ROOT}/companies/$1.php -f
RewriteRule ^([^.]+)$ /companies/$1.php [L]

# BEGIN WordPress
# :

これは実際にはURLからremove/companiesサブディレクトリ(または.php拡張)を((変更された質問のタイトル)-そのためには、HTMLソース内のこれらのファイルへの実際のリンクを変更する必要があります。

これにより、URLで/companiesディレクトリを指定しなくても、ページ/リソースにアクセスできます。

PDATE:この元のリダイレクトから新しいリダイレクトに変更できますか?

はい、最初のルールを変更します。

# Any requests for /companies directly are ignored
# This includes rewritten requests (below)
RewriteRule ^companies/ - [L]

代わりに次のように:

# Redirect any "direct" requests to the `/companies` directory
# to remove the directory from the URL-path.
# Also removes the ".php" extension (if present)
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^companies(/.*?)(?:\.php)?$ $1 [R=302,L]

正規表現のキャプチャサブパターン(/.*?)は貪欲ではありません(?で示されます)。これは、オプションのキャプチャを回避するためです.phpファイル拡張子。

REDIRECT_STATUS環境変数をチェックする条件(RewriteCondディレクティブ)により、直接のリクエストのみがチェックされ、書き換えられないことが保証されます以下のディレクティブによるリクエスト。これにより、リダイレクトループが回避されます。 REDIRECT_STATUS env varは最初のリクエストでは設定されず、最初の書き換えが成功した後にHTTPステータスコード(つまり200)に設定されます。

このリダイレクトは、古いURLが既に検索エンジンによってインデックスが作成されているか、外部のサードパーティによってリンクされている場合にのみ必要です。これにより、アプリケーションの古いURLを置き換える必要がなくなります。

また、これは現在一時的な(302)リダイレクトであることにも注意してください。正常に機能することを確認したら、これを永続的な(301)リダイレクトに変更してください。

概要

2つの部分を一緒にする:

Options -MultiViews

# Redirect any "direct" requests to the `/companies` directory
# to remove the directory from the URL-path.
# Also removes the ".php" extension (if present)
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^companies(/.*?)(?:\.php)?$ $1 [R=301,L]

# Check if the requested resource exists in the /companies subdirectory.
# If so, rewrite the request to that subdirectory.
RewriteCond %{DOCUMENT_ROOT}/companies/$1 -f
RewriteRule (.+\.(css|js|png|jpg|gif))$ /companies/$1 [L]

# Check if the requested PHP file exists in the /companies subdirectory
# if requesting a URL that does not already have a file extension.
# NB: Assumes the URL-path does not otherwise contain dots.
# If so, rewrite the request to that subdirectory appending ".php"
RewriteCond %{DOCUMENT_ROOT}/companies/$1.php -f
RewriteRule ^([^.]+)$ /companies/$1.php [L]

# BEGIN WordPress
# :
3
MrWhite