これは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/ ファイルが見つかりません。今大丈夫です。
私はこれが実際にバグだとは思わない。抽出したコードここ.htaccess
VirtualHostディレクティブではなくファイルで使用するためのものです。それは明らかです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://または他のプロトコル指定子で始まらない書き換え先は、ファイルシステムパスと見なされます。
答え2
ホームページの内部リンクをすべて変更して問題を解決しました。
https://mysite.com/index.php
到着
https://mysite.com/