이것은 Centos 8의 Apache 2.4.37 웹 서버 구성입니다.
파일 /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>
두 번째 규칙 블록은 다음과 같습니다.여기에서 가져온모든 URL을 https://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/