.htaccess Как проверить, не существует ли расширение URI + файла перед RewriteRule - PullRequest
1 голос
/ 12 февраля 2012

При доступе к странице через URL-адрес, подобный следующему:

/ pagename

Как мы можем проверить, существует ли следующий файл через htaccess

/ pagename.htm

А затем загрузите index.php, если нет?

Вот с чем я работаю:

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Я попробовал вариант этого, но не повезло: RewriteCond% {REQUEST_URI}! /. Htm -f

1 Ответ

4 голосов
/ 12 февраля 2012
# If the URI is not .htm and doesn't have any additonal params, try .htm
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(?![^/]+\.htm)([^/]+)$ $1.htm [L,R=302]
# Adding the R flag causes the URI to be rewritten in the browser rather than just internally

# If the URI is .htm but it doesn't exist, pass to index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/\.]+\.htm)$ $1/no [L]

# Passes requested path as 'q' to index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/no/?$ index.php?q=$1 [L]

Должен работать довольно элегантно для вас.Если он не может найти файл, он просто передает его в index.php.Вы, конечно, можете изменить используемую переменную, я просто использовал q для общих целей.

Также обратите внимание, что вы можете сократить это до единого набора RewriteConds.Я расширил их для аннотаций здесь.

...