Laravel:某些html标记在我的WYSIWYG编辑器中导致405错误

问题描述

我在laravel 7中创建了一个所见即所得的编辑器。完成表单后( 数据以html格式),请求将通过PUT方法发送到服务器进行存储,并通过POST进行修改。它在我的本地机器上完美工作(使用PHP artisan服务),但是一旦在生产服务器上,一些html标签(例如:img,style,script)就给我405错误(此路线不支持GET方法。受支持方法:PUT。)。但是,如果我不放置这些引起问题的标签,则该请求有效。因此,我认为它来自HTTPS协议,该协议肯定不喜欢潜在的危险标签。您有解决此问题的方法吗?

谢谢

编辑:

说明:在表单中,我隐藏了所有输入字段,而是显示内容,因为它将在网站上发布(在商品标签中),然后在提交表单时,completeForm()函数将放置所有内容文本区域中的文章(在文章标签中),然后将其发送到服务器。

路线代码

Route::group(['prefix' => '/article'],function () {
      Route::get('create','News\NewsController@create')->name('admin.news.create');
      Route::get('formEdit/{id}','News\NewsController@formEdit')->name('admin.news.formEdit');
      Route::put('store','News\NewsController@store')->name('admin.news.store');
      Route::delete('delete/{id}','News\NewsController@delete')->name('admin.news.delete');
      Route::post('edit/{id}','News\NewsController@edit')->name('admin.news.edit');
});

控制器代码(存储功能):

public function store(RequestNews $request){

      $news = new News();

      $news->title = $request->get('title');
      $news->slug = $this->generateSlug($request->get('title'));
      $news->image_cover_id = $request->get('coverImageId');
      $news->content = Purifier::clean($request->get('content'));
      $news->news_category_id = $request->get("newscategory");
      $news->user_id = Auth::id();

      $news->save();
      
      $teams = $request->get("teams");
      $news->teams()->sync($teams);

      $events = $request->get("events");
      $news->events()->sync($events);

      return Redirect::route("admin.news")->with('success','Article ajouté');
}

RequestNews规则:

public function rules()
    {
        return [
            'title' => 'required|string','coverImageId' => 'required|exists:media,id','content' => 'required','newscategory' => 'required|exists:news_categories,'teams' => 'nullable','teams.*' => 'exists:teams,'events' => 'nullable','events.*' => 'exists:teams,id'
        ];
    }

表单代码

@if(isset($news->id))
        <form class="uk-form-stacked" onsubmit="completeForm()" method="post" action="{{route("admin.news.".$action,["id"=>$news->id])}}" enctype="multipart/form-data">
@else
       <form class="uk-form-stacked" onsubmit="completeForm()" method="post" action="{{route("admin.news.".$action)}}" enctype="multipart/form-data">
       @method('put')
@endif
      @csrf()
      <input type="hidden" id="title-news" name="title">
      <input type="hidden" value="@if($errors->any()) {{old('coverImageId')}} @elseif(isset($news)) {{$news->image_cover_id}} @endif" id="form-image-cover-id" name="coverImageId">
      <input type="hidden" name="content" id="content-news">

      <div class="admin-container">
            <div class="edit-content">

                @if($errors->any())
                    <h1 id="title-news-value" contenteditable="true">{!! old('title') !!}</h1>
                @elseif(isset($news->title))
                    <h1 id="title-news-value" contenteditable="true">{!! $news->title !!}</h1>
                @else
                    <h1 id="title-news-value" contenteditable="true">Titre de l'article</h1>
                @endif
                <div class="uk-margin">
                    <div class="uk-margin uk-width-1-2@s f-cat" style="margin: 0 auto">
                        <label class="uk-form-label" for="form-news-category">Catégorie de l'article*</label>
                        <div class="uk-form-controls">
                            <select class="uk-select" name="newscategory" id="form-news-category">
                                <option value="">_</option>
                                @foreach($newscategories as $newscategory)
                                    <option value="{{$newscategory->id}}" @if($errors->any()) {{ (old("newscategory") == $newscategory->id ? "selected":"") }} @elseif(isset($news->newscategory) && $news->newscategory == $newscategory) {{"selected"}} @endif>{{$newscategory->name}}</option>
                                @endforeach
                            </select>
                        </div>
                    </div>
                    <div class="uk-width-1-4@s multiple-form">
                        <label class="uk-form-label" >Équipes concernées</label>
                        <div class="uk-panel uk-panel-scrollable">
                            <ul class="uk-list">
                                @foreach($teams as $team)
                                    <li>
                                        <label style="text-transform: capitalize">
                                            <input name="teams[]" @if(is_array(old('teams')) && in_array($team->id,old('teams'))) checked="true" @elseif(isset($news->teams) && $news->teams->contains("id",$team->id)) checked="true" @endif class="uk-checkBox" type="checkBox" value="{{$team->id }}">
                                            {{$team->name}} - {{$team->section->name}}
                                        </label>
                                    </li>
                                @endforeach
                            </ul>
                        </div>
                    </div>
                    <div class="uk-width-1-4@s multiple-form">
                        <label class="uk-form-label" >Manifestations concernées</label>
                        <div class="uk-panel uk-panel-scrollable">
                            <ul class="uk-list">
                                @foreach($events as $event)
                                    <li>
                                        <label style="text-transform: capitalize">
                                            <input name="events[]" @if(is_array(old('events')) && in_array($event->id,old('events'))) checked="true" @elseif(isset($news->events) && $news->events->contains("id",$event->id)) checked="true" @endif  class="uk-checkBox" type="checkBox" value="{{$event->id }}">
                                            {{$event->name}}
                                        </label>
                                    </li>
                                @endforeach
                            </ul>
                        </div>
                    </div>
                </div>
                <div class="cover-image">
                    <a id="open-cover" onclick="openModalCoverImage()" class="uk-button uk-button-default">Choisir une image de couverture*</a>
                    <img @if($errors->any()) data-id="{{old('coverImageId')}}" @elseif(isset($news)) data-id="{{$news->image_cover_id}}" @endif id="image-view">
                </div>
                <article>
                    @if($errors->any())
                        {!! old('content') !!}
                    @elseif(isset($news->content))
                        {!! $news->content !!}
                    @else
                        <h2 class="text-news-ed text-news-dl">Sous-titre</h2>
                        <p class="text-news-ed text-news-dl text-ed">Lorem ipsum dolor sit amet,consectetur adipiscing elit. Cras malesuada blandit tellus,nec viverra dui. Etiam a nisi ac diam volutpat gravida non ut elit. Praesent fringilla lorem dui,eu mollis sapien commodo id. Nulla semper posuere ligula,sed dapibus magna rutrum ut. Maecenas posuere lacinia libero,eu tincidunt eros auctor ut. Pellentesque pulvinar semper vulputate. Curabitur sed metus metus. Duis mattis eros vel metus tincidunt ultricies. In hendrerit elit et enim blandit,eu tristique nisl bibendum. </p>
                    @endif
                </article>
            </div>
      </form>

提交代码

function completeForm() {

    let inputTitle = document.getElementById("title-news");
    let title = document.getElementById("title-news-value").innerText;
    inputTitle.value = title;

    let inputContent = document.getElementById("content-news");
    let content = formateContent();
    inputContent.value = content;

}

function formateContent(){
    let article = document.getElementsByTagName("article")[0];

    let contentEditable = article.getElementsByClassName("text-news-ed");
    for(let i=0; i<contentEditable.length; i++){
        contentEditable[i].removeAttribute( "contenteditable");
        contentEditable[i].classList.remove( "contenteditable");

    }

    let contentEditablenopencil = article.getElementsByClassName("text-news-np");
    for(let i=0; i<contentEditablenopencil.length; i++){
        contentEditablenopencil[i].classList.remove("editable-no-pencil");

    }

    return article.innerHTML;
}

请注意,我还使用Purifer(https://github.com/mewebstudio/Purifier)来“固定”所见即所得。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)