#php #.htaccess
#php #.htaccess
Вопрос:
Мне нужна помощь с файлом htaccess:
Options -Indexes
Options FollowSymLinks
DirectoryIndex index.html index.htm index.asp index.php
ErrorDocument 401 http://www.domainname.com
ErrorDocument 403 http://www.domainname.com
ErrorDocument 404 http://www.domainname.com
ErrorDocument 500 http://www.domainname.com
ErrorDocument 507 http://www.domainname.com
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.domainname.com$
RewriteRule ^(.*) http://domainname.com/$1 [QSA,L,R]
RewriteRule ^(.*/)?index.([a-zA-Z0-9]{3,4})$ /$1 [R=301,L]
RewriteRule ^(.*).htm$ $1.php [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index1.php?/$1 [L]
AddType text/html .html .htm .asp
AddType text/css .css
AddType image/vnd.microsoft.icon .ico
AddType image/jpeg .jpg
ExpiresActive on
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType image/vnd.microsoft.icon "access plus 3 months"
<IfModule mod_headers.c>
<FilesMatch ".(js|css|xml|gz)$">
Header append Vary Accept-Encoding
</FilesMatch>
</IfModule>
# compress the files
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript
# removes some bugs
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
Header append Vary User-Agent
У меня есть эта строка в моем файле htaccess RewriteRule ^(.*/)?index.([a-zA-Z0-9]{3,4})$ /$1 [R=301,L]
на данный момент она перенаправляет любое посещение, которое я получаю в индексном файле, в корень этого файла, так что попадание на
http://www.domainname.com/index.asp станет http://www.domainname.com / это именно то, что я хочу. Однако, если домен попадает во вложенную папку с индексным файлом, он будет отображать только каталог, а не название страницы:http://www.domainname.com/folder1/folder2/index.asp станет http://www.domainname.com/folder1/folder2 / это не то, чего я хочу.
Как мне это исправить, чтобы RewriteRule ^(.*/)?index.([a-zA-Z0-9]{3,4})$ /$1 [R=301,L]
перенаправлять в root только в том случае, если он нажат на http://www.domainname.com/index.asp и не во всех каталогах.
Спасибо!
Комментарии:
1. Просто в качестве примечания, нет ничего более раздражающего, чем фактическое перенаправление в случае ошибки 404. Если вы вводите URL вручную, а после опечатки он автоматически перенаправляет вас, это очень раздражает, поскольку вы не можете просто исправить введенный вами URL.
2. Мне любопытно, что у меня есть как ErrorDocument 404, так и этот RewriteCond%{REQUEST_FILENAME} ! -f перезаписать второй%{REQUEST_FILENAME} ! -d RewriteRule ^(.*)$ index1.php ?/$1 [L] Я думаю, что перезапись будет иметь приоритет.
3. Ошибка document — на данный момент фактически не работает. Если страница не существует, она все равно переходит на страницу. Поэтому я мог бы прокомментировать это позже или полностью удалить.
4. Это фактически подводит меня к следующей проблеме, с которой я столкнулся. Если пользователь вводит в домене такой domainname.com/test это приведет к созданию страницы. (даже если страница не существует), а не перенаправляет его на документ с ошибкой.
5. Это из-за трех строк, о которых я опубликовал. !-f означает не файл, !-d означает не каталог. Итак, что происходит, Apache проверяет, существует ли запрошенный файл на самом деле, и если это не так, он перенаправляет вас на index1.php страница с именем запроса, вставленным в конце. Это не генерирует код 404. Если вы хотите обычную обработку 404, вам нужно удалить эти три строки.
Ответ №1:
Первая часть вашего регулярного выражения правила перезаписи соответствует чему-либо вплоть до / (или нет). Мы можем удалить эту часть и просто заставить ее вступить в силу в корневом каталоге.
RewriteRule ^index.([a-zA-Z0-9]{3,4})$ / [R=301,L]