web-dev-qa-db-ja.com

.htaccessファイルをどこに/どのように配置しますか?

Apache2サーバーの.htaccessファイルを更新/作成して、ファイル拡張子なしでWebページにアクセスできるようにしようとしています(www.example.com/whatis.phpにwww.example.com/whatis/としてアクセスできるようになりました) 。 .htaccessの編集に関する指示に従ってみましたが、ここで.htaccessを作成しました。

/etc/Apache2/sites-available/.htaccess

私はここで.htaccessファイルを読み上げました: http://httpd.Apache.org/docs/2.2/howto/htaccess.htmlhttp://wiki.Apache.org/ httpd/Htaccess

しかし、ドキュメントが役に立たなかった。私の理解では、サーバーに特定の指示を与える各レベル/ディレクトリに「.htaccess」という名前のファイルを配置する必要があります。サーバーがすべてのファイルの.php拡張子を遮断するようにしたいので、上の場所に.htaccessファイルを作成し、その中にこれを置きます。

RewriteEngine on
RewriteRule ^([^/\.]+)/?$ $1.php [L]

ただし、Apache2サーバーを再起動した後でも、パス名を短くすることはできません。パス名から.phpを引いたものをロードしようとすると、ページが見つかりません。問題はコードではなく.htaccessファイルにあると推測しています。

要するに、.htaccessファイルをどこに置くべきか、そしてこれらは一般的にどのように機能するのでしょうか?推奨リソースがある場合は、興味があります。ありがとうございました。

5
Fawn

フォルダー/ディレクトリに独自のhtaccessルールを持たせたい場合は、そのディレクトリに.htaccessファイルを置くことができ、そのファイルはルートディレクトリにある.htaccessファイルに取って代わります。

各サブフォルダーの.htaccessファイルは各URLに使用され、2つのhtaccessファイルが異なることを指示する場合、URLに最も近い.htaccessファイルが優先されます。

例:

Example.com/dir1/dir2/page.htmlの場合、example.com /、dir /、およびdir2 /の.htaccessファイルがすべて使用され、dir2の.htaccessファイルはdir1の.htaccessファイルの競合を上書きし、 dir2。

特定のディレクトリに.htaccessファイルがない場合は、問題ありません。他の利用可能な.htaccessファイルが使用されます。

たとえば、これにより、ルートディレクトリの.htaccessファイルがサイト上のすべてのURLのIPアドレスをブロックできるようになります。また、サイトの他のサブディレクトリには使用したくない特定のサブディレクトリにカスタムルールを作成できます。


Example.com/page.phpの代わりにexample.com/pageを表示する例を次に示します。

#remove php file extension
#https://example.com/file.php will become https://example.com/file
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L]

example.com/page.htmlの代わりにexample.com/page

#remove html file extension 
#https://example.com/file.html will become https://example.com/file
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html [NC,L]

上記のhtaccessコードを実装した後、サイトに.phpおよび.html拡張子を持つディレクトリがまだある場合は、これが発生しているディレクトリの.htaccessファイルに上記のhtaccessコードを実装してみてください。そのディレクトリ内の.htaccessファイルは、ルートに近い.htaccessファイルよりも優先されるはずです。


また、注目に値するのは、.htaccessファイルが時系列で動作することです。つまり、.htaccessファイルの後半のコード行は、以前に記述されたコード行に優先します。したがって、.phpおよび.html拡張子の削除に問題がある場合は、他のコードと競合する場合に備えて、そのコードを.htaccessファイルの一番下に配置する価値があります。

Wordpress上の.phpおよび.html拡張子の削除に問題がある場合は、上記の.htaccessコードを# BEGIN WordPress # END WordPress行の後に配置してください。

3
Michael d

<VirtualHost ...>定義内には、DocumentRootがあります。

たとえば、Webサイトexample.comを作成し、そのWebサイトを以下に配置するとします。

/var/www/example.com/public_html/

<VirtualHost ...>は次のようになります。

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot /var/www/example.com/public_html/
    ServerName example.com

    ... # other descriptions
</VirtualHost>

まず、.htaccessの下に/var/www/example.com/public_html/を設定できます。これはルートフォルダーと呼ばれます。

そのルートフォルダーの下にあるサブフォルダーには、独自の.htaccessを含めることもできます。サブフォルダー.htaccessは、ルートまたは親フォルダーよりも優先されます。

たとえば、Drupalのfilesフォルダーには.htaccessがあり、そのフォルダーでPHPコードを実行できないようにします。 filesフォルダーは、Drupalフロントエンドからファイルをアップロードできる場所です。つまり、最終的に.phpをアップロードしてから実行することができます。そこに.htaccessがあると、そのような実行の可能性を防ぎます。彼らが使用するコマンドは次のとおりです。

php_flag engine off

一方、/etc/Apache2/sites-available/*.conf構成ファイルには、.htaccessに入力したものと同じコマンドが含まれているため、.htaccessの下に/etc/Apache2/...は必要ありません。

違いは、<Directory ...>ディレクティブを使用して、そこでフラグを微調整することです。そのDrupalの例では、次を使用します。

<Directory "/var/www/example.com/public_html/sites/default/files">
    php_flag engine off
</Directory>

これは.htaccessファイルとまったく同じ偉業を達成し、ほとんどの場合、はるかに高速になります。

.htaccessは、GoDaddyやBluehostなどのシステムで共有ホスティングを使用する場合に便利です。 /etc/Apache2ファイルに直接アクセスできないため、これは便利です。そうでない場合、Apacheは.htaccessファイルがあるかどうかをチェックする必要がないため、この機能をオフにすると処理が高速になります。上記のファイルの例では、これは次のディレクトリを確認することを意味します。

/var/www/example.com/public_html/sites/default/files
/var/www/example.com/public_html/sites/default
/var/www/example.com/public_html/sites
/var/www/example.com/public_html

最初の.htaccessが使用されるため、その特定のケースでは、最初のディレクトリで停止します。多くのサブディレクトリがあり、ほとんどが.htaccessを持っていない場合、それはそれらすべてを何度も繰り返し調べます。そのため、これらのファイルを使用しない(および/etc/Apache2/...設定で機能をオフにする)と、サーバーをかなりのサイクル節約できます。

最後に、ユーザーに.phpを使用せずに通常のパスを入力させたいときに、通常.phpファイルを実行する方法に関する質問に答えるために、index.phpを使用します(ほとんどの場合、実際にそのファイルに名前を付けることができます) want)から、さまざまなinclude/requireなどを使用して必要なコードを実行します。コードが単純な場合、単純なrequireで十分です。

Apacheコードは次のようになります。

<Directory "/var/www/example.com/public_html">
    DirectoryIndex index.php

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</Directory>

これは、index.phpを実行して、qクエリ文字列にパスを入れます。 (これはDrupalの方法です。実際にはクエリ文字列は必要ありません。)個人的に、私は次を使用しました:

<Directory "/var/www/example.com/public_html">
    DirectoryIndex index.php

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php [last,passthrough,qsappend]
</Directory>

ただし、Apache2サーバーの他の設定によっては、システムで機能しない場合があります。

Index.phpで、REQUEST_URIパラメーターとしてパスを取得します。

$pos = strpos($_SERVER["REQUEST_URI"], '?');
if($pos === FALSE)
{
    $path = $_SERVER["REQUEST_URI"];
}
else
{
    // remove the query string if present
    //
    $path = substr($_SERVER["REQUEST_URI"], 0, $pos);
}

これでパスができ、対応するコードを実行できます。

require $path . ".php";

ただし、$pathコンテンツは非常に汚染される可能性があるため、確認することを強くお勧めします。最初に、ファイルが存在しない場合、404を返します。

$php = $path . ".php";
if(!file_exists($php))
{
    http_response_code(404);
    echo "<h1>Page Not Found</h1><p>Sorry Could Not Find Your Page...</p>";
}
switch($path)
{
case 'this-path-is-allowed':
case 'and/it/works/with/sub-paths':
    require $php;
    break;

default:
    // emit another error, maybe a 403 or 500?
    http_response_code(403);
    echo "<h1>Page Not Accessible</h1><p>Sorry Not Authorized Here.</p>";
    break;

}

ご覧のとおり、.phpをそのように回避し、実行するものと実行しないものをより適切に制御できます。そのようにすると、多くの.phpファイルを作成できますが、ごく少数のファイルのみを期待どおりに実行できます(ただし、Apacheから直接アクセスできないはずのファイルをルートディレクトリの外に置く方がはるかに賢く、ホストによっては常に実行できるとは限りません)または使用しているCMS。)

別の方法は、試したことはありませんが、.phpが存在するかどうかをテストし、存在する場合はパスを書き換えることです。

RewriteCond %{REQUEST_FILENAME}.php !-f
RewriteRule ^(.*)$ /$1.php [last,passthrough,qsappend]

当然、ディレクトリ内の.phpファイルはフロントエンドから実行可能になります。心に留めておくべきこと。ただし、独自のPHPコードを作成するときは、ルートディレクトリ以下にのみパブリックファイルを配置するため、問題にはなりません。これがpublic_htmlサブディレクトリを持っている理由です。私の他のPHPファイルは通常、個別のphpディレクトリの下に配置されます。

/var/www/example.com/php           -- server side only PHP files
/var/www/example.com/public_html   -- public PHP, image, CSS, JS... files

/var/www/example.com/php内のすべてのものは、/var/www/example.com/public_htmlの下にあるPHPファイルからインクルードできますが、クライアントはそれらのファイルにアクセスできません。 WordPress、Drupalなどよりもはるかに安全です(それでも世界を支配していますか?!)

それのもう一つの重要な側面。ユーザーが.phpを使用して(上記のコードの一部を使用して)ファイルにアクセスできるようにする場合は、ページに正規のメタタグを配置する必要があります。それ。

1
Alexis Wilke

.htacessファイルは/ var/www/htmlに配置する必要があります。 htmlフォルダーがない場合は、wwwディレクトリーに配置します。

その前に、他のいくつかの構成を変更する必要があります。 URLの書き換えを有効にする必要があるため、最初に有効にする必要があります。これは、次のコマンドで実行できます。

Sudo a2enmod rewrite

次に、Apacheのデフォルト構成ファイルを変更する必要があります。次を入力してこのファイルを開きます

Sudo nano /etc/Apache2/sites-available/default

そのファイル内で、次のセクションを見つけ、AllowOverrideという行をNoneからAllに変更します。セクションは次のようになります。

<Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
 </Directory>

これを完了したら、次のコマンドでApacheサーバーを再起動します

Sudo service Apache2 restart

これは仕事をする必要があります。

1
Vishnu Ks