웹사이트 루트 디렉토리의 URL 재작성

웹사이트 루트 디렉토리의 URL 재작성

이것은 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/ 파일을 찾을 수 없습니다. 이제 괜찮아.

나는 이것이 실제로 버그라고 생각하지 않습니다. 추출한 코드여기.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:// 또는 기타 프로토콜 지정자로 시작하지 않는 재작성 대상은 파일 시스템 경로로 간주됩니다.

답변2

홈페이지의 내부 링크를 모두 변경하여 문제를 해결했습니다.

https://mysite.com/index.php 

도착하다

https://mysite.com/  

관련 정보