WebサイトのルートディレクトリのURLを書き換える

WebサイトのルートディレクトリのURLを書き換える

これはCentos 8のApache 2.4.37 Webサーバー構成です。

ファイル/etc/httpd/conf.d/mysite.conf:

<VirtualHost *:80>

    ServerName mysite.com
    DocumentRoot "/var/www/html"

    RewriteEngine on

    RewriteCond %{SERVER_NAME} =mysite.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>

ファイル/etc/httpd/conf.d/mysite-ssl.conf:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName mysite.com
    DocumentRoot "/var/www/html"

    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem

    ErrorDocument 403 /error403.html
    ErrorDocument 404 /error404.html
    ErrorDocument 405 /error405.html
    ErrorDocument 500 /error500.html

    RewriteEngine on

    # First rule block
    RewriteRule ^/$ /index.php [R,L]

    # Second rule block    
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(([^/]+/)*([^/.]+))\.php[\ ?]
    RewriteRule \.php$ /%1/ [R=301,NC,L]
    RewriteRule ^(.*)/$ /$1.php [NC,L]

    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"

    TraceEnable off
</VirtualHost>
</IfModule>

2番目のルールブロックは次のとおりです。ここからインポートすべてのURLhttps://mysite.com/anypage.phpをに書き直してhttps://mysite.com/anypage/PHPファイル拡張子を非表示にし、永続リンクをより見やすくします。

リンクで提案されたソリューションにバグがあることを確認した後、最初のルールブロックを追加しました。つまり、URLがhttps://mysite.com/ファイルが見つからないことを返しました。今動作します。

しかし、マイナーな迷惑は(ファイルをロードするため)https://mysite.com/にリダイレクトされるということです。https://mysite.com/index/index.php

https://mysite.com/私の質問:URLが同じになるようにこの設定をどのように変更できますか?

ベストアンサー1

リンクが提案したソリューションにエラー(つまりURL)があることを確認した後、最初のルールブロックを追加しました。https://mysite.com/ ファイルが見つかりません。今大丈夫です。

私はこれが実際にバグだとは思わない。抽出したコードここ.htaccessVirtualHostディレクティブではなくファイルで使用するためのものです。それは明らかですRewriteRule は、VirtualHost ディレクティブと同様に、.htaccess ファイルとまったく同じようには機能しません。、これがいくつかの問題を引き起こす原因です。

元のコードを見てみましょう。

RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(([^/]+/)*([^/.]+))\.php[\ ?]
RewriteRule \.php$ /%1/ [R=301,NC,L]
RewriteRule ^(.*)/$ /$1.php [NC,L]

VirtualHostディレクティブでは(とは異なり.htaccess)、パスの先行スラッシュも正規表現と一致するため、次にリクエストをhttp://mysite.com/送信するとき

 RewriteRule ^(.*)/$ /$1.php [NC,L]

/正規表現と一致します^(.*)/$。これは、逆参照が空の文字列と同じであり、生成されたパスがサーバーに存在しないパスになることを$1意味します。/.php

簡単な解決策は、元のコードを.htaccessファイルに入れることです。ドキュメントルートサーバーのディレクトリ(つまり、すべての公開ファイルを含むディレクトリ)。

ただし、VirtualHostディレクティブでRewriteRulesを維持したい場合(推奨されていない)、前にスラッシュを追加して元のコードを少し変更できます。

RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(([^/]+/)*([^/.]+))\.php[\ ?]
RewriteRule \.php$ /%1/ [R=301,NC,L]
RewriteRule ^/(.*)/$ /$1.php [NC,L]

これでリクエストを送信すると、Apacheは成功せずに一致しようとhttp://mysite.com/するため、URLは同じままです。一方、要求はと一致して目的の結果にマッピングされます。/^/(.*)/$http://mysite.com/foo//foo/^/(.*)/$/foo.php

返品、RewriteRuleに完全な宛先URLを指定しない場合、ApacheはそのURLがDocumentRootではなくサーバーのローカルファイルシステムから来たと仮定します。

http://または他のプロトコル指定子で始まらない書き換え先は、ファイルシステムパスと見なされます。

おすすめ記事