web-dev-qa-db-ja.com

mod_rewriteを使用して.php拡張子を削除する

Mod_rewriteルールセットが必要なため、.php拡張子のないページを参照できますが、php拡張子を含めるように書き換えてください。これは1&1サーバーで実行されます。

自分でもっと学ぶための参考資料はありますか?

41
James
RewriteEngine On
RewriteRule something something.php [L]

http://example.com/somethingは、something.phpに対するリクエストであるかのように処理されます

すべてのリクエストが同じ名前の物理ファイルではなく、.phpを使用してリダイレクトするには:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.*) $1.php [L]
55
Dan Grossman

上記の受け入れられた答えは、URLから.php拡張子を削除せず、拡張子なしで.phpファイルにアクセスできるようにするだけです。 .php拡張子をurlsから完全に削除するには、root/.htaccessで次のルールを使用できます。

RewriteEngine on

#1)externally redirect "/file.php" to "/file"   
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
#2)Internally map "/file" back to "/file.php"
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,L]
13
starkeen

おそらくあなたが本当に欲しいのは、接尾辞をまったく持たない方法です。これを行うために私が見つけた最良の方法は、.htaccessまたはApache構成ファイルでFilesディレクティブを使用することです。

<Files myscript>
   SetHandler cgi-script
</Files>

これにより、.phpファイルへの直接アクセスなど、書き換えの欠点の一部が回避されます。

4
Poor Yorick

.htaccessファイル:次の行を追加します。

Options +MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

https://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess/

次に、Apache2.logファイルでAllowOverride条件を確認する必要があります。WebルートディレクトリでオプションAllowOverRide Allを設定します。

    Options Indexes FollowSymLinks  
    AllowOverride All  
    Require all granted

.php拡張子なしでWebページにアクセスしようとすると、Apacheのerror.logファイルで次のエラーが発生する場合があります。/var/www/html/web/.htaccess:無効なコマンド「RewriteEngine」、おそらくスペルミスまたは定義済みサーバー構成に含まれていないモジュールによって

これを修正するには:mod_rewriteモジュールがインストールされていません。インストールするには:次のコマンドを実行します。ln -s /etc/Apache2/mods-available/rewrite.load /etc/Apache2/mods-enabled/rewrite.load

。htaccess:無効なコマンド「RewriteEngine」。スペルミスがあるか、サーバー構成に含まれていないモジュールによって定義されている可能性があります

繰り返しますが、Webページを更新した後、error.logファイルに次のエラーが記録される場合があります。

[negotiation:error] [pid 4650] [client 127.0.0.1:46461] AH00687: Negotiation: discovered file(s) matching request: /var/www/html/web/test (None could be negotiated). (I was trying to access localhost/web/test.php using the url: localhost/web/test)

これを修正するには、Apache2.confに次の行を追加する必要があります。

<IfModule mod_mime.c>
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtml
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php4
AddType application/x-httpd-php .html
AddType application/x-httpd-php-source .phps

https://forums.digitalpoint.com/threads/htaccess-addtype-application-x-httpd-php-php-htm-html-and-maybe-a-fix.7584/#post-2491687 =

これで、ファイル名だけを使用してtest.phpファイルにアクセスできます:test

3
user3683297

このオプションは、クリーンなSEOフレンドリーなURLを作成します。表示されているURLから.php拡張子を削除し、.phpを使用せずにURLにアクセスすると、.phpファイルが表示されたままになります。複数のスレッドでこれを達成する別の答えを見つけることができませんでした。

必ずmodの書き換えを有効にしてください。 DebianまたはUnbuntu linuxでは、以下が機能します

Sudo a2enmodの書き換え

そして

SudoサービスのApache2の再起動

Apache2.confファイルの対応するセクションを次のように変更します。

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule (.*) $1.php [L]
        RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
        RewriteRule ^ /%1 [NC,L,R]
</Directory>

.htaccessを使用して書き換える場合は、Apache2.confで少なくともこれらのオプションが有効になっていることを確認してください。

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
        RewriteEngine On
</Directory>

最後に、Apacheのインストール時に、AllowOveride All/etc/Apache2/sites-availableまたは/ etc/Apache2/sites-enabledの.confファイル内。
。htaccessではなくApache2.confファイルからの書き換えはより高速であると噂されています。

1
Greggory Wiley

何らかの理由で、他のソリューションを適切に機能させることができませんでした。これをサイトのルートにある.htaccessファイルに入れます。うまくいけば、これはあなたのために働くでしょう。

RewriteEngine on #only use this once per .htaccess
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php 

ヘッダーまたはURLに.php拡張子が含まれている場合は削除されないことに注意してください。拡張機能を削除する必要があります。

これを使って...

header 'location: /login';

これよりも...

header 'location: /login.php';
1
EternalHour

いくつかの単一ファイルを送信する場合は、RewriteEngineを避ける方が簡単かもしれません。

私はこれを使用しました:

<Files $filename>
   SetHandler application/x-httpd-php
</Files>

書き換えよりも強力で柔軟性はありませんが、おそらくより高速で、PHPとして処理する特定のファイルをいくつか作成したい場合の方法のようです。

0
John

http://example.com/test リンク http://example.com/test.php を取得するには:

RewriteEngine on
RewriteRule ^([^\.]+)$ /folder/$1.php [NC,L] 
0
Zon