htacces2変数の問題

Nov 26 2020

SSLをインストールするは、問題なく動作していました。ルートウェブサーバーの.htaccessファイルにあるコードは次のとおりです。

Options +MultiViews
RewriteEngine On
RewriteCond %{HTTP_HOST} andrea\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://andrea.com/$1 [R,L]

RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule (.*) $1.php [L]

それは機能し、私がやりたいことを正確に実行します。だから私が例えばに行くと:

www.andrea.com/account

「www.andrea.com/account.php」にアクセスします。それが私が欲しいものです。ただし、ルートには「products」というフォルダがあります。そのフォルダに別の「.htaccess」ファイルがあり、以下のことを機能させるためにこれら2つのうちどちらを変更する必要があるのか​​わかりません。

このURLにアクセスすると:http:____ / products / view / Hello / Goodbye

'products'フォルダーの "view.php"にアクセスしたいのですが、そのphpファイルで次のことができます。

$id = $_GET["id"];    //      This would have "Hello"
$cat = $_GET["cat"];    //   This would have "Goodbye"

そして、これは「products」フォルダでこのhtaccessを使用するとうまく機能します。

RewriteEngine on
RewriteCond %{HTTP_HOST} !^$ RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2

上記のこのコードの問題は、次の場所に移動した場合です: http:____ / products / Hello / Goodbye

「products」フォルダにある「index.php」にアクセスしてほしい。しかし、代わりに「view.php」に移動します!! これは、上記のhtaccessコードがすべてview.phpに移動するように強制したようなものです(これは、URLに「view / ____」がある場合にのみ実行する必要があります。上記のURLを「products」の「index.php」に移動したい"フォルダとそのファイルで、ID変数とCAT変数にアクセスできるはずです。

.htaccessファイルで何を変更するかについてのアイデアはありますか?申し訳ありませんが、2時間以上費やしましたが、コードの下部にある1行がわかりませんが、機能しません:/

回答

1 AmitVerma Nov 26 2020 at 11:35

あなたは書き換えるには、以下のルールを使用することができます/products/Hello/Goodbye/products/index.php

RewriteRule ^Hello/GoodBye/?$ /product/index.php?id=hello&cat=Goodbye  [L,NC]

これがあなたの完全なもの/product/.htaccessです。

RewriteEngine on
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
#rewrite /products/Hello/GoodBye to /products/index.php
RewriteRule ^Hello/GoodBye/?$ /products/index.php?id=Hello&cat=Goodbye [L,NC] ################### RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2
1 MrWhite Nov 27 2020 at 07:13
 Options +MultiViews

まず、MultiViewを無効にする必要があります。で、私の答えはあなたの以前の質問、のMultiViewsを使用するための私の提案は、厳密にあなたの質問の文脈での「代替」方法でした。両方の方法(mod_rewriteMultiViews)を使用して拡張子のないURLを操作することはできません。また、より多くのことを実行してパラメーターを渡したいので、MultiViewは競合を作成するだけです。(MultiViewは「勝つ」可能性が高く、パラメーターは渡されません。)

また、サブディレクトリに追加の.htaccessファイルが特に必要/productsですか?.htaccessドキュメントルートに単一のファイルを含める方が(おそらく)簡単です。これにより、HTTPからHTTPSへのリダイレクトを繰り返す必要がなくなります(ただし、実際にはHTTPからHTTPSへのリダイレクトをサブディレクトリ.htaccessファイルに含めていませんか?)。

# /products/.htaccess
RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2

このディレクティブはview/Hello/Goodbye との 両方に一致Hello/Goodbyeしますview.php。これは、すべてがスクリプトに書き込まれる理由を説明しています。しかし、それは実際にはあなたが言うこともしていません-それは不可解です。リクエスト/products/view/Hello/Goodbyeすると、リクエストが/products/view.php?id=view&cat=Hello/Goodbye-に書き換えられますが、これは意図されたものではありません(MutliViewsが有効になっている場合を除きます。有効になっている場合、パラメータはまったく渡されません)。

viewsに書き換える前に、要求されたURLパスを実際にチェックする必要がありますviews.php。そして、views存在しない場合は、index.php代わりにに書き直してください。この「条件付き分岐」は、最初に「より具体的な」ルールの順序でディレクティブを配置するだけで実現できます。

たとえば、ルート.htaccessファイルで次のことを試してください。(そして/products/.htaccessファイルを完全に削除します。)

# Ensure that MultiViews is disabled
Options -MultiViews

RewriteEngine On

# HTTP to HTTPS canonical redirect
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://example.com/$1 [R=301,L]

# Abort early if the request already maps to (or looks like) a file or directory
RewriteCond %{REQUEST_URI} \.\w{2,4}$ [OR] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 1. Rewrite "/products/view/<id>/<cat>" to "/products/view.php?id=<id>&cat=<cat> RewriteRule ^(products/view)/([^/]*)/?(.*) $1.php?id=$2&cat=$3 [L]

# 2. Rewrite "/products/<id>/<cat>" to "/products/index.php?id=<id>&cat=<cat>
RewriteRule ^(products)/([^/]*)/?(.*) $1/index.php?id=$2&cat=$3 [L] # 3. Extensionless URLs for other requests RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]

上記の3つのルールの順序は重要です。最も具体的なルールが最初です。Lそれ以上の(不要な)処理を防ぐためのフラグを含めます。

元のディレクティブに従って、フォーム/products/view/Hello/Goodbye(または/products/Hello/Goodbye)のリクエストのHello/Goodbye場合、パーツは完全にオプションであり、当然、idおよびcatURLパラメーターが設定されますが、空であることに注意してください。

また、元のディレクティブに従って、フォーム/products/view/Hello/Goodbye/foo/bar/bazをリクエストすると、catURLパラメータがGoodbye/foo/bar/baz(最初のパスセグメントに続くもの)に設定されます。

正規表現をより具体的にし、一致する必要があるものだけに一致する場合は、要求がファイルまたはディレクトリ(比較的高価です)にマップされていることを必ずしも確認する必要はありません。たとえば、/([^/]*)/?(.*)現在、正規表現はほとんどすべてに一致します。ただし<id><cat>変数が小文字のみで構成されている場合(たとえば)、これによりファイルシステムチェックの必要性を回避できます。

その他の注意事項:

  • HTTPからHTTPSへのリダイレクトでホスト名を確認する必要がありますか?複数のドメインをホストしていますか?それ以外の場合は、HTTP_HOSTサーバー変数をチェックする条件は必要ありません。