Из за htaccess перестала работать обратная связь

12
S_A_N_T_A
На сайте с 23.11.2009
Offline
146
1014

Доброго времени суток.

Добавил в htaccess

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME}.html -f

RewriteRule ^.*$ $0.html [L,QSA]

RewriteCond %{THE_REQUEST} ([^\s]*)\.html(\?[^\s]*)?

RewriteRule (.*) %1 [R=301,L]

Чтобы убрать расширение ".html" для всех html файлов, так как сайт без движка.

Но теперь перестала работать обратная связь, использующая метод POST.

В PHP и htaccess совсем не разбираюсь.

Ребят поможет кто-нибудь?

KK
На сайте с 06.03.2014
Offline
47
#1

Я не силен в этом, но на мой взгляд, набор правил странный...

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Это для всех не физических файлов и папок.

RewriteCond %{REQUEST_FILENAME}.html -f

Это если есть такой файл (на диске).

Т.е. правила взаимоисключающие.

Что было раньше и что хотели сделать?

---------- Добавлено 13.11.2018 в 18:11 ----------

Рецепт из сети, чтобы убрать расширение файла:

RewriteEngine on

#Если это не папка

RewriteCond %{REQUEST_FILENAME} !-d

#Если это файл html на диске

RewriteCond %{REQUEST_FILENAME}\.html -f

RewriteRule ^(.*)$ $1.html [NC,L]

S_A_N_T_A
На сайте с 23.11.2009
Offline
146
#2
Konstantin K:
Что было раньше и что хотели сделать?

Раньше было "пустой htaccess" =))

Нужно убрать расширение ".html" для всех html файлов, так как сайт без движка

Чтобы при обращении например к

sitname.ru/filename.html

sitname.ru/filename

был ответ сервера 301 и редирект на

sitname.ru/filename/

VC
На сайте с 27.10.2002
Offline
127
VIC
#3
S_A_N_T_A:

Чтобы при обращении например к

sitname.ru/filename.html
sitname.ru/filename

был ответ сервера 301 и редирект на

sitname.ru/filename/

То есть, у вас статика, а вы хотите файлы *.html представить как директории?

Вот так, к примеру.


RewriteEngine on
RewriteBase /
# Перенаправление при запросе *.html
RewriteCond %{REQUEST_FILENAME} \.html$
RewriteRule (.*)\.html http://sitname.ru/$1/ [R=301,L]
# Подстановка файла (если нет директории с тем же именем и есть файл)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule (.*)/$ $1\.html [END]

Всегда нужно учитывать порядок правил рерайта – сначала запреты, за ними редиректы, потом подстановки. Иначе что-нибудь работать не станет.

PS Немного поигрался с этим набором правил, теперь могу точно сказать, что в последней строке нужен флаг [END]. А флаг [L] вместо него способен вызвать "зацикливание" – и проверка для редиректа по .html, и подстановка тоже.

KK
На сайте с 06.03.2014
Offline
47
#4

Ну и мой вариант до кучи. :)

RewriteEngine on

RewriteBase /

# Добавляем слэш в конце URL

# кроме файлов определенных типов

RewriteCond %{REQUEST_URI} !\.(php|html?|jpg|jpeg|gif)$

RewriteRule ^(.*)([^/])$ /$1$2/ [L,R=301]

# Удаляем символы .html в конце URL

RewriteCond %{THE_REQUEST} ([^\s]*)\.html

RewriteRule .* %1/ [L,R=301]

# Редиректим на html-файл, если он существует

# и в конце URL (ищем в запросе) есть слэш

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME}.html -f

RewriteCond %{THE_REQUEST} ([^\s]*)/

RewriteRule ^.*$ %1.html [L,QSA]

---------- Добавлено 14.11.2018 в 00:32 ----------

Про взаимоисключающие правила, кстати, я был не прав.

Там все логично.

S_A_N_T_A
На сайте с 23.11.2009
Offline
146
#5

VIC

VIC:
RewriteEngine on
RewriteBase /
# Перенаправление при запросе *.html
RewriteCond %{REQUEST_FILENAME} \.html$
RewriteRule (.*)\.html http://sitname.ru/$1/ [R=301,L]
# Подстановка файла (если нет директории с тем же именем и есть файл)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule (.*)/$ $1\.html [END]

После добавления этого когда в htaccess у меня сайт перестал открываться

Konstantin K

VIC:

RewriteEngine on
RewriteBase /

# Добавляем слэш в конце URL
# кроме файлов определенных типов
RewriteCond %{REQUEST_URI} !\.(php|html?|jpg|jpeg|gif)$
RewriteRule ^(.*)([^/])$ /$1$2/ [L,R=301]

# Удаляем символы .html в конце URL
RewriteCond %{THE_REQUEST} ([^\s]*)\.html
RewriteRule .* %1/ [L,R=301]

# Редиректим на html-файл, если он существует
# и в конце URL (ищем в запросе) есть слэш
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteCond %{THE_REQUEST} ([^\s]*)/
RewriteRule ^.*$ %1.html [L,QSA]

Спасибо Вам! Перенаправление происходит.

Консоль ругалась, что не подгружается JS и PNG

Методом тыка изменил вот эту строчку

RewriteCond %{REQUEST_URI} !\.(php|js|css|xml|txt|ico|jpeg|htm|html?|jpg|jpeg|png|gif|png)$

Добавил туда CSS, JS, PNG. Кончено я не уверен, но не лишний ли там вопросительный знак после "HTML"?

Подскажите пожалуйста, как можно сделать, чтобы сервер отдавал ответ

sitemane.ru/css/filename.css/ - тут должно стать 404

sitemane.ru/css/filename.css - тут пусть остается как есть 200

sitemane.ru/js/filename.js/ - тут должно стать 404

sitemane.ru/js/filename.js - тут пусть остается как есть 200

sitemane.ru/robots.txt/ - тут должно стать 404

sitemane.ru/robots.txt - тут пусть остается как есть 200

sitemane.ru/sitemap.xml/ - тут должно стать 404

sitemane.ru/sitemap.xml - тут пусть остается как есть 200

S_A_N_T_A
На сайте с 23.11.2009
Offline
146
#6

А так же, теперь при обращении по несуществующему url

например sitename.ru/blablabla

сервер отдает ответ 301 и редирект на sitename.ru/blablabla/ (со слешем)

Как можно сделать, чтобы в этом случае не было редиректа, и для страницы sitename.ru/blablabla сразу был ответ 404?

M
На сайте с 04.12.2013
Offline
185
#7

Это все превентивные действия или есть реальное основание редиректить с .html (сайт, будучи раскрученным, какое-то время работал на адресах с .html)?

Осн. приемы тут такие:

1) статик убираете в отдельный каталог и делаете рерайт в него только при наличии соотв. файлов.

2) при редиректе аналогично: прежде чем делать редирект, можно проверять, существует ли цель.

Но лучше перенести статик на какой-нибудь легкий двиг, заточенный под SEO, и не страдать фигней. Хотя с редиректом из движка все равно нужно будет повозиться, но только для норм. бэков, если они были (предполагается, что поисковики уже съели новую адресацию).

---------- Добавлено 14.11.2018 в 16:40 ----------

P.S. Для трэйлинг слэшей редиректы часто остаются шаблонными. Т.е. проверка существования цели не требуется. 404-ая может выдаваться и после редиректа (шаблонного).

Хостинг FOZZY ( http://fozzy.com.ru ) / Выслушаю предложения на домены ( http://u75.ru/domains-for-sale ) / Домены и скрипт для коротких ссылок ( http://u75.ru/domains-for-shortcuts )
S_A_N_T_A
На сайте с 23.11.2009
Offline
146
#8

miketomlin

Спасибо конечно!

Но есть поставленная задача и нужно ее решить.

M
На сайте с 04.12.2013
Offline
185
#9

Наводки я вам дал. Решайте.

KK
На сайте с 06.03.2014
Offline
47
#10
S_A_N_T_A:
я не уверен, но не лишний ли там вопросительный знак после "HTML"?

Знак "?" после символа означает, что он может стоять, а может нет.

Т.е. запись html? соответствует html или htm

Поэтому строку

RewriteCond %{REQUEST_URI} !\.(php|js|css|xml|txt|ico|jpeg|htm|html?|jpg|jpeg|png|gif|png)$

по идее можно переписать так:

RewriteCond %{REQUEST_URI} !\.(php|js|css|xml|txt|ico|jpe?g|html?|png|gif)$

По остальному навскидку не скажу — я всего лишь дизайнер. :)

Вечером проверю.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий