كيف يمكنني استكشاف الأخطاء وإصلاحها لماذا لا يتم تطبيق قواعد إعادة الكتابة الخاصة بي بواسطة Apache؟

StackOverflow https://stackoverflow.com/questions/215316

  •  03-07-2019
  •  | 
  •  

سؤال

لقد حصلت على تطبيق Tomcat 6 على الويب يعمل مع Apache HTTPD كأحد الأمامي. أنا أستخدم mod_proxy و mod_proxy_ajp لإعادة توجيه الطلبات إلى tomcat. خادمي يعمل Ubuntu. الآن أحاول استخدام mod_rewrite لإزالة WWW الرائدة ، بحيث يكون عنوان URL الخاص بي على الويب http://domain.com عوضا عن http://www.domain.com

لقد قرأت عددًا من البرامج التعليمية حول استخدام mod_rewrite ، لكن لا يمكنني الحصول على أي إعادة كتابة للعمل. لقد حاولت وضع قاعدة إعادة الكتابة في ملف .htaccess (بعد تعديل ملف/apache/apache/المواقع المتاحة/الافتراضي لضبط All). لقد حاولت وضع قاعدة إعادة الكتابة في Apache2.Conf و httpd.conf و rewrite.conf. لقد جربت كل هذه مع إعادة كتابة تسجيل الدخول. يتم إنشاء ملف السجل ، لكن أباتشي لم يكتب شيئًا له. اعتقدت أنه ربما كان mod_proxy يمنع بطريقة ما قواعد إعادة الكتابة من استخدامها ، لذلك حاولت تعطيل ذلك أيضًا ... وما زلت لا أحصل على إعادة كتابة ، ولا شيء للسجل.

في هذه المرحلة ، ليس لدي أي فكرة عما يجب تجربته بعد ذلك. كيف يمكنني إجراء استكشاف الأخطاء وإصلاحها لماذا لا يستخدم Apache قواعد إعادة الكتابة الخاصة بي؟

للإشارة ، إليك توجيهاتي لإعادة الكتابة:

<IfModule mod_rewrite.c>

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
    RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
    RewriteLog "/var/log/apache2/rewrite.log"
    RewriteLogLevel 3

</IfModule>

يحرر: الإجابات أدناه مفيدة لحالتي الخاصة ، ولكن ربما لا تكون مفيدة للمجتمع في الوقت الحالي مثل الإجابات حول كيفية استكشاف توجيهات Apache بشكل عام. على سبيل المثال ، هل هناك طريقة لتمكين التسجيل إلى النقطة التي يخبرني فيها التوجيهات التي يتم تطبيقها في أي أمر يأتي عند الطلب؟

تحرير 2: لقد حصلت على أشياء للعمل الآن. لم يتم إعداد مضيفي الظاهري بشكل صحيح ، ولم يكن لدي أيضًا إعادة كتابة REGEX بشكل صحيح. إليكم توجيهات إعادة كتابة النهائي التي حصلت عليها:

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
        RewriteRule ^(.*)$ http://domain.com$1 [L,R=301]
</IfModule>
هل كانت مفيدة؟

المحلول

محاولة الإجابة على سؤالك: لتصحيح عملية Apache يمكنك ضبط تسجيل مستوى إلى مستوى أقل (ربما debug). ولكن حتى لو وضعت debug إذا قمت بتعطيل السجل للوحدة المعنية ، فلن تحصل على أي رسائل منه. على سبيل المثال ، الافتراضي [RequestLogLevel][2] هو 0 ، على سبيل المثال ، الوحدة النمطية لا تكتب أي رسائل. أراك قمت بتعيينه إلى 3 ولكن مثل روبورج قال تغييره إلى 9 ربما يكون هذا منخفضًا جدًا بالنسبة لحالتك.

تحاول أن تتفوق على مشكلتك: حاول تغيير طريقة إعادة كتابة اسم المضيف باستخدام النموذج العكسي - انظر إذا كان اسم المضيف هو ما تريده ، وإذا لم يكن الأمر كذلك ، قم بتغييره إلى اسم المضيف الذي تريده. كما ذكر في دليل إعادة كتابة عنوان URL - خادم Apache HTTP في موقع Apache:

أسماء المضيف الكنسي

وصف: الهدف من هذه القاعدة هو إجبار استخدام اسم مضيف معين ، لتفضيل أسماء المضيف الأخرى التي يمكن استخدامها للوصول إلى نفس الموقع. على سبيل المثال ، إذا كنت ترغب في فرض استخدام www.example.com بدلاً من example.com ، فيمكنك استخدام متغير من الوصفة التالية. المحلول:

# To force the use of 
RewriteEngine On
RewriteCond %{HTTP_HOST}   !^www\.example\.com [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteRule ^/(.*)         http://www.example.com/$1 [L,R]

في مثالهم ، يتغيرون من example.com إلى www.example.com لكنك حصلت على الفكرة. فقط اضبطه لحالتك.

نصائح أخرى

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
    RewriteRule ^(.*)$ "http\:\/\/domain\.com\/$1" [R=301,L]

</IfModule>

كان لديه نفس المشكلة مع الخادم الخاص بي ، لكن هذا نجح

حاول زيادة مستوى التسجيل حتى 9 (الحد الأقصى).
تأكد من أن Apache لديه الحقوق المناسبة في ملف السجل (على الرغم من أنه إذا قام بإنشائه ، فمن المحتمل أن يكتب إليه أيضًا).
جرب قاعدة إعادة كتابة مختلفة ، بدون شرط ، على سبيل المثال RewriteRule .* www.google.com [RL]

في أي سياق يتم وضع هذه القواعد؟ قد تضعها تحت مضيف افتراضي مختلف ، على سبيل المثال. حاول وضعها خارج أي حاوية إذا كان لديك مجال واحد فقط للاختبار.

على أي حال ، هناك بديل لتحقيق "لا www" ، ويتكون في استخدام مضيفين افتراضيين ، أحدهما لشركة WWW والآخر لـ "no-www". www واحد يعيد توجيه إلى الآخر:

<VirtualHost *:80>
    ServerName www.domain.com
    Redirect permanent / http://domain.com
</VirtualHost>


<VirtualHost *:80>
    ServerName domain.com
    #The rest of the configuration (proxying, etc.)
</VirtualHost>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top