>source

페이지가 없는 경우 규칙이 호출되지 않도록 제외하려고 합니다. 내 기존 htaccess에서 이 규칙은 사용자가 루트에서 존재하지 않는 페이지에 액세스할 때 의도한 대로 작동합니다. 이상하게도 사용자가 존재하지 않는 유효한 페이지의 하위 디렉토리에 액세스하려고 하면 작동하지 않습니다.

내 htaccess의 현재 동작:

example.com/valid-page/-> example.com/valid-page/(good)
example.com/valid-page -> example.com/valid-page/(good)
example.com/valid-page/valid-page -> example.com/valid-page/valid-page/(good)
example.com/does-not-exist -> example.com/does-not-exist (good)
example.com/valid-page/does-not-exist -> example.com/valid-page/does-not-exist/(boo!)

위의 나쁜 예에서 원하는 결과는 슬래시를 포함하지 않아야 합니다.

example.com/valid-page/does-not-exist -> example.com/valid-page/does-not-exist

다음은 .htaccess입니다.

# Redirects for errors
ErrorDocument 404 /error.php
ErrorDocument 403 /error.php
# Hides directory file listings
Options -Indexes
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
# Force slash at end of URL
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/[R=301,L]
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L]
# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)/$ $1.php [NC,L]

  • 답변 # 1

    # Force slash at end of URL
    RewriteCond %{REQUEST_URI} /+[^\.]+$
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^(.+[^/])$ %{REQUEST_URI}/[R=301,L]
    

    다음을 확인하는 두 번째 조건을 변경해야 합니다.REQUEST_FILENAME, 왜냐하면 당신이 요청할 때/유효한 페이지/존재하지 않음,REQUEST_FILENAME~이다.../유효한 페이지, 아니다.../유효한 페이지/존재하지 않음당신이 기대하는대로.

    대신REQUEST_FILENAME, 사용하다REQUEST_URI(아니면 그$1역참조) 대신 절대 파일 이름을 구성합니다. 예를 들어:

    # Force slash at end of URL
    RewriteCond %{REQUEST_URI} /+[^\.]+$
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
    RewriteRule ^(.+[^/])$ %{REQUEST_URI}/[R=301,L]
    

    잘못된 301(영구) 리디렉션이 브라우저에서 캐시되므로 테스트하기 전에 브라우저 캐시를 지워야 합니다. 캐싱 문제를 피하기 위해 302(임시) 리디렉션으로 테스트합니다.

    이제 요청하면/유효한 페이지/존재하지 않음당신은 여부를 확인하고 있습니다.../valid-page/does-not-exist.php파일로 존재하지 않고.../유효한 페이지.php이전과.

    보기 내 대답무엇에 대해 더 자세히 설명하는 ServerFault에 대한 다음 질문에REQUEST_FILENAME실제로 설정되어 있습니다.

  • 이전 powershell : 버튼 클릭을 통해 DataGridView 업데이트
  • 다음 android : 코 루틴을 중지하고 반복하는 가장 좋은 방법, kotlin