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ファイルをどこに置くべきか、そしてこれらは一般的にどのように機能するのでしょうか?推奨リソースがある場合は、興味があります。ありがとうございました。
各サブフォルダーの.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
行の後に配置してください。
<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を使用して(上記のコードの一部を使用して)ファイルにアクセスできるようにする場合は、ページに正規のメタタグを配置する必要があります。それ。
.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
これは仕事をする必要があります。