Я пытался изучить htaccess для создания удобных URL-адресов. У меня есть URL-адреса, работающие нормально, но мои контактные формы, которые на одну php-страницу больше, чем уровень глубины, например, в http://www.example.com/category/item-1/, не передают данные формы получателю почты - формы в http://www.example.com/contact/ передают данные просто отлично.
Я предполагаю, что, возможно, часть javascript, где он вызывает php (url: «/php/form-process.php»), переписывается моим любительским htaccess и поэтому вызывает проблему?
Если кто-то может дать несколько советов о том, как лучше всего разрешить передачу данных, я был бы очень признателен, так как я очень новичок в htaccess!
Я думал, что, возможно, нашел ответ здесь (Похоже, что значения POST теряются при использовании .htaccess RewriteRule. Значения GET в порядке. Как исправить?), но добавление решения в мой htaccess, похоже, не решает проблему.
это мой htaccess в корневом каталоге:
Options +MultiViews
RewriteEngine On
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1/ [R=307,L]
# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L,R=307]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=307]
#configure 404
ErrorDocument 404 /404.php
#forward .es to .com
RewriteCond %{HTTP_HOST} ^example\.es$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.es$
RewriteRule ^/?$ "http\://www\.example\.com/es/" [R=307,L]
это мой код формы php в «http://www.example.com/category/item-1/»:
<form role = "form" id = "contactForm" data-toggle = "validator" class = "shake">
<div class = "form-group">
<div class = "controls">
<input type = "hidden" id = "reference" value = "<?php echo htmlencode($propertyRecord['reference']) ?>" >
</div>
</div>
<div class = "form-group">
<div class = "controls">
<input type = "text" id = "name" placeholder = "Name (required)" required data-error = "Please enter your name">
<div class = "help-block with-errors"></div>
</div>
</div>
<div class = "form-group">
<div class = "controls">
<input type = "email" class = "email" id = "email" placeholder = "Email (required)" required data-error = "Please enter your email">
<div class = "help-block with-errors"></div>
</div>
</div>
<div class = "form-group">
<div class = "controls">
<input type = "text" id = "msg_subject" placeholder = "Phone (optional)">
<div class = "help-block with-errors"></div>
</div>
</div>
<div class = "form-group">
<div class = "controls">
<textarea id = "message" rows = "7" placeholder = "Message (required)" required data-error = "Please enter your message message"></textarea>
<div class = "help-block with-errors"></div>
</div>
</div>
<button type = "submit" id = "submit" class = "btn-system btn-small">Send</button>
<div id = "msgSubmit" class = "h3 text-center hidden"></div>
<div class = "clearfix"></div>
</form>
<script type = "text/javascript" src = "/js/contact-form-script.js"></script>
это файл javascript в "/js/contact-form-script.js":
$("#contactForm").validator().on("submit", function (event) {
if (event.isDefaultPrevented()) {
// handle the invalid form...
formError();
submitMSG(false, "Did you fill in the form properly?");
} else {
// everything looks good!
event.preventDefault();
submitForm();
}
});
function submitForm(){
// Initiate Variables With Form Content
var name = $("#name").val();
var email = $("#email").val();
var msg_subject = $("#msg_subject").val();
var message = $("#message").val();
var reference = $("#reference").val();
$.ajax({
type: "POST",
url: "/php/form-process.php",
data: "name = " + name + "&email = " + email + "&msg_subject = " + msg_subject + "&message = " + message + "&reference = " + reference,
success : function(text){
if (text == "success"){
formSuccess();
} else {
formError();
submitMSG(false,text);
}
}
});
}
function formSuccess(){
$("#contactForm")[0].reset();
submitMSG(true, "- Message Sent -")
}
function formError(){
$("#contactForm").removeClass().addClass('shake animated').one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
$(this).removeClass();
});
}
function submitMSG(valid, msg){
if (valid){
var msgClasses = "h4 text-center fadeIn animated text-success";
} else {
var msgClasses = "h4 text-center text-danger";
}
$("#msgSubmit").removeClass().addClass(msgClasses).text(msg);
}
это файл php "/php/form-process.php":
<?php
$errorMSG = "";
$EmailTo = "[email protected]";
$Subject = "Website Enquiry // Ref: $reference // From $name - $email";
// prepare email body text
$Body = "";
$Body .= "Reference: ";
$Body .= $reference;
$Body .= "\n";
$Body .= "Name: ";
$Body .= iconv('utf-8', 'iso-8859-1', $name);
$Body .= "\n";
$Body .= "Email: ";
$Body .= $email;
$Body .= "\n";
$Body .= "Phone: ";
$Body .= $msg_subject;
$Body .= "\n";
$Body .= "Message: ";
$Body .= iconv('utf-8', 'iso-8859-1', $message);
$Body .= "\n";
// send email
$success = mail($EmailTo, $Subject, $Body, "From:".$email);
// redirect to success page
if ($success && $errorMSG == ""){
echo "success";
}else{
if ($errorMSG == ""){
echo "Something went wrong :(";
} else {
echo $errorMSG;
}
}
?>
Заранее большое спасибо за помощь!
Еще см. также: Как отлаживать Apache mod_rewrite / И, возможно, Ссылка: mod_rewrite, объяснение перезаписи URL и «красивых ссылок»
Привет, Марио, да, ты прав, это довольно сложно, так как я здесь очень новичок. Насколько я вижу, у меня нет проблем с сайтом, и удобные для пользователя ссылки работают везде, но я думаю, что мой htacess определенно не самый эффективный способ его написания. Я добавил комментарии, которые должны были быть включены ранее. Большое спасибо за ссылки на редактирование, они определенно помогут мне в обучении.
С этими файлами .htaccess помните, что меньше значит больше. Посмотрите документацию Вордпресс .htaccess для примера и узнайте, как умно они использовали всего несколько строк, чтобы передать это.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это чудо, что эти правила не вызывают бесконечный цикл перенаправления. Это выглядит довольно собранным вместе. Вместо того, чтобы комментировать отсутствие комментариев, позвольте мне просто поднять непопулярную опцию нет, выполняющую переписывание URL-адреса Любые.