Перезапись с modrewrite, если файл существует для чистых URL - PullRequest
2 голосов
/ 18 июля 2011

Для того, чтобы иметь хорошие чистые URL с какой-то архетектурой сайта, я использую modrewrite в моем файле .htaccess. Я не хочу расширений файлов (.php или .html).

У меня есть следующее:

<IfModule mod_rewrite.c>
RewriteEngine On
</IfModule>
RewriteRule ^([a-zA-Z0-9-]+)/$ $1.html [L]
RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/$ $1/$2.html [L]
RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/$ $1/$2/$3.html [L]

Но я хочу, чтобы он сначала проверил, существует ли файл index.html в подкаталоге. Например, я хочу

http://example.com/first/

переписать на

http://example.com/first.html

но если этого не существует, то переписать на

http://example.com/first/index.html

То же самое для подкаталогов, например, я хочу

http://example.com/first/second/

переписать на

http://example.com/first/second.html

но если этого не существует, то переписать на

http://example.com/first/second/index.html

Возможно ли это, и как мне этого добиться?

Ответы [ 2 ]

4 голосов
/ 18 июля 2011

Это должно работать для вас (работает для меня):

DirectoryIndex index.html

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Do not do anything for already existing files and folders
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule .+ - [L]

    # add .html file extension (if such file does exist)
    RewriteCond %{DOCUMENT_ROOT}/$1\.html -f
    RewriteRule ^(.+[^/])/?$ $1.html [L,QSA]
</IfModule>
  1. Если вы используете <IfModule mod_rewrite.c>, поместите ВСЕ правило перезаписи между тегами, а не просто RewriteEngine On.

  2. Правило проверяет, существует ли такой файл с расширением .html перед перезаписью. Для http://example.com/first/second/ он проверит, существует ли WEBSITE_ROOT/first/second.html. Если нет - то все останется как есть, и Apache автоматически получит http://example.com/first/second/index.html из-за директивы DirectoryIndex index.html (см. Самую первую строку).

  3. Обратите внимание: эти 2 URL-адреса обрабатываются одинаково с точки зрения механизма перезаписи: http://example.com/first/second/ и http://example.com/first/second (обратите внимание, что косой черты нет). Если вы хотите, чтобы это были 2 разных URL-адреса (только перезаписать один с косой чертой), удалите ? и [^/] из последнего правила перезаписи (например, RewriteRule ^(.+)/$ $1.html [L,QSA]).

  4. Для URL http://example.com/first/second/ - если у вас есть и папка /first/second/, и файл /first/second.html, тогда запрос будет отправлен в папку (а /first/second/index.html будет окончательным URL - см. # 2 ).

0 голосов
/ 18 июля 2011

Вы можете использовать RewriteCond something -f, чтобы проверить, является ли что-то на самом деле файлом.Для каталогов вы можете использовать вместо этого флаг -d.

...